私は認証からWordPress Rest Apiを使用してAPIからより多くのデータを取得しようとしています。 Oauthプラグイン、rest-apiプラグインをインストールし、WP-CLIからAPI認証情報を取得しました。
許可なくデータにアクセスする方法を考え出しました。これは動作します:
// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/";
$curl = curl_init($endpoint);
curl_setopt_array($curl, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);
?>
<pre>
<?php print_r($decoderesponse); ?>
</pre>
しかし、資格で認証する方法を私は理解することはできません。これが私の試みです。 「鍵」と「秘密」が正しいのかどうかはわかりません。
// Oauth credentials from wp-cli
$ID = "4";
$Key = "l8XZD9lX89kb";
$Secret = "UUbcc8vjUkGjuDyvK1gRTts9sZp2N8k9tbIQaGjZ6SNOyR4d";
// set our end point
$domain = "http://localhost/wp-api";
$endpoint = $domain."/wp-json/wp/v2/posts/1/revisions";
$headers[] = "key=$Key";
$headers[] = "secret=$Secret";
$curl = curl_init($endpoint);
curl_setopt_array($curl, [
CURLOPT_HTTPHEADER => $headers,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_URL => $endpoint,
]);
$response = curl_exec($curl);
$decoderesponse = json_decode($response, true);
?>
<pre>
<?php print_r($decoderesponse); ?>
</pre>
出力は
Array
(
[code] => rest_cannot_read
[message] => Sorry, you cannot view revisions of this post.
[data] => Array
(
[status] => 401
)
)
これを機能させるにはどうすればよいですか。ありがとうございました。
ここから一歩ずつ行きましょう。認証のためだけにOAuthを使用しようとしているようですが、それを行う前にアクセストークンを取得する必要がありますこれは、API呼び出しを行うときに認証に使用されます。
これはOAuthバージョン1を使用しているため、Access Tokenを取得するには、次を実行する必要があります。
最初のいくつかの手順ではPostmanを使用することをお勧めします。これらの手順は一度だけ完了する必要があるからです。 Postmanはtimestamp
、nonce
、およびoauth signature
の生成も処理するため、OAuthライブラリを使用していない場合は、絶対にPostmanを使用する必要があります。 アクセストークンを取得したら、ライブラリなしでCURL経由で呼び出しを行うことができます。
WP OAuth 1プラグインをインストールし、アクティブ化して、Users> Applications。新しいアプリケーションを追加し、名前と説明を入力します。コールバックの場合、ユーザーをリダイレクトするURL(認証後)、または(リダイレクトではなく)検証トークンを表示する内部ページにリダイレクトするアウトオブバンドフローのoop
のいずれか。
https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md
2番目のステップに進むには、Client IDおよびClient Secretを使用して、サイトに対して呼び出しを行う必要があります作成されたアプリケーションから、一時的な資格情報(要求トークン)を取得します。
Postmanを開き、http://website.com/oauth1/request
への新しい呼び出しを作成し、[承認]タブをクリックして、ドロップダウンからOAuth 1.0を選択し、クライアントキー、クライアントシークレットを入力し、署名方法をHMAC-SHA1
に設定し、ヘッダーへのパラメーターの追加を有効にし、 encode oauth signatureをクリックし、Update Requestをクリックします
Postmanは署名、ノンス、およびタイムスタンプを自動生成し、ヘッダーに追加します(ヘッダータブで表示できます)。
[送信]をクリックすると、oauth_token
とoauth_token_secret
を含む応答が返されます。
これらの値は、次の手順でWordPressユーザーアカウントでアプリケーションを承認するために使用されます。
承認ステップは一度だけ完了する必要があります。このステップはユーザー向けであり、誰もが知っているステップです。 OAuth1を使用しており、アプリケーションをWordPressユーザーアカウントに関連付ける必要があるため、この手順が必要です。サイトでFacebookでログインできる場合を考えてください...彼らはログインしてFacebookにアクセスし、「承認」をクリックします...これは、あなたのWordPressサイトから行う必要があります。
URLの変数を簡単に設定できるため、このステップでWebブラウザを使用することをお勧めします。これにより、アプリケーションを認証するための「認証」ページが提供されます。
Webブラウザーを開き、次のようにサイトのURLを入力します。http://website.com/oauth1/authorize
このURL、oauth_consumer_key
(クライアントID)、oauth_token
、およびoauth_token_secret
に追加します(前のステップから)。私の例では、これは完全なURLです。
http://website.com/oauth1/authorize?oauth_consumer_key=TUPFNj1ZTd8u&oauth_token=J98cN81p01aqSdFd9rjkHZWI&oauth_token_secret=RkrMhw8YzXQljyh99BrNHmP7phryUvZgVObpmJtos3QExG1O
[認証]をクリックすると、確認トークンを含む別の画面が表示されます。私の例では、これはE0JnxjjYxc32fMr2AF0uWsZm
で返される検証トークンです
アプリケーションの認証が完了したので、最後の呼び出しを1回行って、すべてのAPI呼び出しを行うために使用される認証トークンを取得する必要があります。最初のステップと同様に、Postmanを使用します(署名がHMAC-SHA1である必要があるため)。これにより、これらのステップを100倍簡単に実行できます。
Postmanを再度開き、URLをhttp://website.com/oauth1/access
に変更します
トークンとトークンシークレット(最初のステップの値)を追加してから、Paramsをクリックして、URLの下にボックスを表示します。左側にoauth_verifierと入力し、右側に2番目のステップのコードVerification Token
必ず[更新リクエスト]をクリックしてから[送信]をクリックすると、oauth_token
とoauth_token_secret
で応答が返されます...これがAPI呼び出しを行うために必要なものです!手順1で作成した元のものを破棄し、これらをコードまたは安全な場所に保存します。
その後、サイトにAPI呼び出しを行い、返されたトークンとトークンシークレットでヘッダーを設定できます。
Authorizationヘッダー、GETパラメーター、またはPOST(application/x-www-form-urlencodedとしてエンコードされている場合)で、この複数の方法を渡すことができます。署名、タイムスタンプ、およびナンスを渡す必要があることに注意してください。この返信にどれくらいの時間がかかるかわかりませんでしたので、コードでそれを行う例で明日更新します。
REST APIログをインストールして、API呼び出しのログを表示し、送信されたもの、返されたものなどを確認できるようにすることを強くお勧めします。これは、デバッグに非常に役立ちます。
これを別の答えとして追加すると、これを行う方法を理解するのに役立ちます。基本的に私のコメントで述べたように、OAuth1を使用する場合は、ユーザーアカウントに関連付ける必要がありますが、それを回避する方法はありません。
まず、CURLを使用してWordPressのユーザー名パスワードでサイトにログインし、OAuthへのCURL呼び出しで使用できるようにCookieを保存する必要があります(CURL呼び出しを更新してCookieを含めるようにしてください) ):
https://stackoverflow.com/questions/724107/wordpress-autologin-using-curl-or-fsockopen-in-php
次に、一時的なOAuthトークンとシークレット(要求トークン)を取得するために、クライアントIDとクライアントシークレットでCURLを使用してoauthを呼び出します。
この呼び出し(およびアクセストークンを取得する呼び出し)を行うには、CURL呼び出しを正しく設定する必要があります。コードとリファレンスについては、この回答の最後をご覧ください。
一時的なoauthトークンとシークレット(リクエストトークン)を取得したら、サイトのこのURLにCURL POST呼び出しを行います。
http://website.com/oauth1/authorize
次に、承認ページに返されたHTMLからすべての値を取得し、独自のPOSTをフォームアクションURLに送信する必要があります。
https://stackoverflow.com/questions/35363815/how-to-get-a-value-input-from-html-returned-of-curl
具体的には、これらのデータをPOSTデータに含めて、http://domain.com/wp-login.php?action=oauth1_authorize
への「承認」POSTを完了する必要があります。
_wpnonce
-これは送信するフォームのナンス値です。これはHTML入力から取得し、POSTで送信する必要があります
consumer
-これはHTMLの非表示入力です(これは投稿IDへの参照であるため、HTML入力から取得する必要があります)
oauth_token
-これはHTMLの非表示入力です(ただし、これも既にあるはずです)
wp-submit
-値に設定する必要がありますauthorize
認証ページ用に生成されたHTMLの例を次に示します。
<form name="oauth1_authorize_form" id="oauth1_authorize_form" action="http://website.com/wp-login.php?action=oauth1_authorize" method="post">
<h2 class="login-title">Connect My Auth</h2>
<div class="login-info">
<p>Howdy <strong>admin</strong>,<br/> "My OAuth Demo" would like to connect to Example Site.</p>
</div>
<input type="hidden" name="consumer" value="5428" /><input type="hidden" name="oauth_token" value="i1scugFXyPENniCP4kABKtGb" /><input type="hidden" id="_wpnonce" name="_wpnonce" value="ca9b267b4f" /><input type="hidden" name="_wp_http_referer" value="/wp-login.php?action=oauth1_authorize&oauth_consumer_key=TUPFNj1ZTd8u&oauth_token=i1scugFXyPENniCP4kABKtGb&oauth_token_secret=gzqW47pHG0tilFm9WT7lUgLoqN2YqS6tFFjUEiQoMgcmG2ic" /> <p class="submit">
<button type="submit" name="wp-submit" value="authorize" class="button button-primary button-large">Authorize</button>
<button type="submit" name="wp-submit" value="cancel" class="button button-large">Cancel</button>
</p>
</form>
これらのすべての値/データでPOSTを作成すると、これは認証コードとともに返されるHTMLです(したがって、<code>
ブロック内から値を取得する必要があります:
<div id="login">
<h1><a href="https://wordpress.org/" title="Powered by WordPress" tabindex="-1">Example Site</a></h1>
<p>Your verification token is <code>yGOYFpyawe8iZmmcizqVIw3f</code></p> <p id="backtoblog"><a href="http://website.com/">← Back to Example Site</a></p>
</div>
検証トークンを取得したら、検証トークン、oauthトークン、およびoauthトークンシークレットを使用して、/oauth1/access
を呼び出すことができます。検証トークンは、POSTデータにoauth_verifier
として配置する必要があります
これにより、新しい永続的なアクセストークンとVOILAが返されます!
以下は、CURL呼び出しを行うためのサンプルコードです。最も重要な部分は、oauth_signature
の生成方法です。
https://oauth1.wp-api.org/docs/basics/Signing.html
function buildBaseString($baseURI, $method, $params){
$r = array();
ksort($params);
foreach($params as $key=>$value){
$r[] = "$key=" . rawurlencode($value);
}
return $method."&" . rawurlencode($baseURI) . '&' . rawurlencode(implode('&', $r));
}
function buildAuthorizationHeader($oauth){
$r = 'Authorization: OAuth ';
$values = array();
foreach($oauth as $key=>$value)
$values[] = "$key=\"" . rawurlencode($value) . "\"";
$r .= implode(', ', $values);
return $r;
}
// Add request, authorize, etc to end of URL based on what call you're making
$url = "http://domain.com/oauth/";
$consumer_key = "CLIENT ID HERE";
$consumer_secret = "CLIENT SECRET HERE";
$oauth = array( 'oauth_consumer_key' => $consumer_key,
'oauth_nonce' => time(),
'oauth_signature_method' => 'HMAC-SHA1',
'oauth_callback' => 'oob',
'oauth_timestamp' => time(),
'oauth_version' => '1.0');
$base_info = buildBaseString($url, 'GET', $oauth);
$composite_key = rawurlencode($consumer_secret) . '&' . rawurlencode($oauth_access_token_secret);
$oauth_signature = base64_encode(hash_hmac('sha1', $base_info, $composite_key, true));
$oauth['oauth_signature'] = $oauth_signature;
$header = array(buildAuthorizationHeader($oauth), 'Expect:');
$options = array( CURLOPT_HTTPHEADER => $header,
CURLOPT_HEADER => false,
CURLOPT_URL => $url,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false);
$feed = curl_init();
curl_setopt_array($feed, $options);
$json = curl_exec($feed);
curl_close($feed);
$return_data = json_decode($json);
print_r($return_data);
このサイトでは、OAuth署名のエンコード方法とCURLを使用した送信方法を正確に説明しています(ページ全体を読むことをお勧めします): https://hannah.wf/Twitter-oauth-simple- curl-requests-for-your-own-data /
OAuth1署名の生成に関するその他のリソース: https://stackoverflow.com/questions/24613277/oauth-signature-generation-using-hmac-sha1
その他のリソース: http://collaboradev.com/2011/04/01/Twitter-oauth-php-tutorial/
更新日:私が読んだものから、あなたはそれからクエリを行うために使用するaccess_tokenを得るために複数のカールをする必要があります
もう少し遅くなってきていることは知っていますが、wp_remote_getと_postを使用できますか。
私はそれらを使用して私のwordpressのインストールでコンテンツを引っ張って投稿しています:
これはワードプレスコーデックスからの一般的なアイデアです:
$response = wp_remote_post( $url, array(
'body' => $data,
'httpversion' => '1.0',
'sslverify' => false,
'headers' => array(
'Authorization' => 'Basic ' . base64_encode( $username . ':' . $password ),
),
) );
これがより具体的な例です。
$url='http://WWW.EXAMPLE HERE.';
$response = wp_remote_post( $url, array(
'method' => 'POST',
'timeout' => 45,
'redirection' => 5,
'httpversion' => '1.0', //needed to get a response
'blocking' => true,
'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MY TOKENID' . ':' . '' )),
'body' => $body // in array
'cookies' => array()
)
);
if ( is_wp_error( $response ) ) {
$error_message = $response->get_error_message();
echo "Something went wrong: $error_message";
} else {
// echo 'Response:<pre>';
// print_r( $response );
// echo '</pre>';
$responseBody = json_decode($response['body'],true);
echo $responseBody['message'];
}
}
}
トリックは、ユーザー名とpwをエンコードすることです。多くの場合、APIのユーザー名とpwに応じて時間は空白になるか、トークンになります。
例えば上記の私の特定の例では、ヘッダーは
'headers' => array('Authorization' => 'Basic ' . base64_encode( 'MYTOKENID' . ':' . '' ))
そして私はpwを空白のままにしました。それはあなたが使っているAPIシステム次第です。