web-dev-qa-db-ja.com

OAuth認証を使用する方法 REST CURLコマンド経由のAPI?

私は認証から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
        )
)

これを機能させるにはどうすればよいですか。ありがとうございました。

17
JediTricks007

ここから一歩ずつ行きましょう。認証のためだけにOAuthを使用しようとしているようですが、それを行う前にアクセストークンを取得する必要がありますこれは、API呼び出しを行うときに認証に使用されます。

これはOAuthバージョン1を使用しているため、Access Tokenを取得するには、次を実行する必要があります。

  1. まず、アプリケーションをセットアップし、サイトの呼び出しを行って、アプリケーションのクライアントIDとシークレットを使用してRequest Token(tempクレデンシャル)を取得します
  2. 第二に、最初のステップからのRequest Tokenを使用してアプリケーションを認証するためにサイトを呼び出します(ユーザー向け、以下を参照)。
  3. 第三に、承認が完了したら、サイトに呼び出してAccess Tokenを取得します(現在、そのアプリケーションは承認されています)

最初のいくつかの手順ではPostmanを使用することをお勧めします。これらの手順は一度だけ完了する必要があるからです。 Postmanはtimestampnonce、およびoauth signatureの生成も処理するため、OAuthライブラリを使用していない場合は、絶対にPostmanを使用する必要があります。 アクセストークンを取得したら、ライブラリなしでCURL経由で呼び出しを行うことができます。

https://www.getpostman.com/

最初のステップ(セットアップアプリケーション)

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 OAuth1 Request

Postmanは署名、ノンス、およびタイムスタンプを自動生成し、ヘッダーに追加します(ヘッダータブで表示できます)。

[送信]をクリックすると、oauth_tokenoauth_token_secretを含む応答が返されます。 Postman OAuth1 Request Response

これらの値は、次の手順でWordPressユーザーアカウントでアプリケーションを承認するために使用されます。

2番目のステップ(アプリケーションの承認)

承認ステップは一度だけ完了する必要があります。このステップはユーザー向けであり、誰もが知っているステップです。 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

OAuth1 Authorize Application

[認証]をクリックすると、確認トークンを含む別の画面が表示されます。私の例では、これはE0JnxjjYxc32fMr2AF0uWsZmで返される検証トークンです

3番目のステップ(アクセストークンの取得)

アプリケーションの認証が完了したので、最後の呼び出しを1回行って、すべてのAPI呼び出しを行うために使用される認証トークンを取得する必要があります。最初のステップと同様に、Postmanを使用します(署名がHMAC-SHA1である必要があるため)。これにより、これらのステップを100倍簡単に実行できます。

Postmanを再度開き、URLをhttp://website.com/oauth1/accessに変更します

トークンとトークンシークレット(最初のステップの値)を追加してから、Paramsをクリックして、URLの下にボックスを表示します。左側にoauth_verifierと入力し、右側に2番目のステップのコードVerification Token

Postman OAuth1 Access Step

必ず[更新リクエスト]をクリックしてから[送信]をクリックすると、oauth_tokenoauth_token_secretで応答が返されます...これがAPI呼び出しを行うために必要なものです!手順1で作成した元のものを破棄し、これらをコードまたは安全な場所に保存します。

Postman OAuth1 Access Response

その後、サイトにAPI呼び出しを行い、返されたトークンとトークンシークレットでヘッダーを設定できます。

Authorizationヘッダー、GETパラメーター、またはPOST(application/x-www-form-urlencodedとしてエンコードされている場合)で、この複数の方法を渡すことができます。署名、タイムスタンプ、およびナンスを渡す必要があることに注意してください。この返信にどれくらいの時間がかかるかわかりませんでしたので、コードでそれを行う例で明日更新します。

REST APIログをインストールして、API呼び出しのログを表示し、送信されたもの、返されたものなどを確認できるようにすることを強くお勧めします。これは、デバッグに非常に役立ちます。

https://github.com/petenelson/wp-rest-api-log

9
sMyles

これを別の答えとして追加すると、これを行う方法を理解するのに役立ちます。基本的に私のコメントで述べたように、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&amp;oauth_consumer_key=TUPFNj1ZTd8u&amp;oauth_token=i1scugFXyPENniCP4kABKtGb&amp;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/">&larr; Back to Example Site</a></p>
</div>

検証トークンを取得したら、検証トークン、oauthトークン、およびoauthトークンシークレットを使用して、/oauth1/accessを呼び出すことができます。検証トークンは、POSTデータにoauth_verifierとして配置する必要があります

これにより、新しい永続的なアクセストークンとVOILAが返されます!

CURLコードの例

以下は、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/

2
sMyles

更新日:私が読んだものから、あなたはそれからクエリを行うために使用するaccess_tokenを得るために複数のカールをする必要があります

  • 一時的な認証情報の取得:クライアントはサーバーから一連の一時的な認証情報を取得します。
  • 承認:ユーザーは自分のアカウントにアクセスするための要求トークンを「承認」します。
  • トークン交換:クライアントは、寿命の短いトークンと寿命の短い一時的な資格情報を交換します。

oauth1サーバーフロー

0
juz

もう少し遅くなってきていることは知っていますが、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システム次第です。

0
rudtek