CURLコマンドを介してREST APIでOAuth認証を使用する方法は?


18

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

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


2
物事はそれほど簡単ではありません。私は答えを書き込もうとしてきましたが、かなり長いです。ドキュメント、特にThe Authorization Flowを読むことから始めることができます。この投稿には素晴らしいチュートリアルもあります。
サイブメタ

回答:


10

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

これはOAuthバージョン1を使用しているため、アクセストークンを取得するには、以下を実行する必要があります。

  1. まず、アプリケーションをセットアップし、サイトの呼び出しを行って、アプリケーションのクライアントIDとシークレットを使用してリクエストトークン(一時的な資格情報)を取得します。
  2. 次に、サイトへの呼び出しを行って、最初のステップからのリクエストトークンでアプリケーションを認証します(ユーザー向け、以下を参照)。
  3. 第三に、認証が完了したら、サイトに電話をかけてアクセストークンを取得します(アプリケーションは認証されました)

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

https://www.getpostman.com/

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

WP OAuth 1プラグインをインストールしてアクティブにし、[ユーザー ] > [アプリケーション ]の下のメニュー項目に移動します。新しいアプリケーションを追加し、名前と説明を入力します。コールバックの場合、ユーザーをリダイレクトするURL(認証後)、またはoop(リダイレクトではなく)検証トークンを表示する内部ページにリダイレクトするアウトオブバンドフローのいずれか。

https://github.com/WP-API/OAuth1/blob/master/docs/basics/Registering.md

2番目のステップに進むには、作成されたアプリケーションからクライアントIDクライアントシークレットを使用してサイトに呼び出しを行い、一時的な資格情報(リクエストトークン)を取得する必要があります。

Postmanを開き、新しい呼び出しを作成しhttp://website.com/oauth1/request、[承認]タブをクリックし、ドロップダウンから[OAuth 1.0]を選択し、クライアントキー、クライアントシークレットを入力し、署名方法を設定しHMAC-SHA1、ヘッダーにパラメーターを追加し、oauth署名をエンコードし、[ 更新要求 ]をクリックします。

Postman OAuth1リクエスト

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

送信をクリックすると、含む応答を取得する必要oauth_tokenとしますoauth_token_secretPostman OAuth1リクエストレスポンス

これらの値は、次のステップで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承認アプリケーション

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

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

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

Postmanを再度開き、URLを http://website.com/oauth1/access

トークンとトークンシークレット(最初のステップの値)を追加してから、[ パラメータ ]をクリックして、URLの下にボックスを表示してください。左側にoauth_verifierと入力し、右側に2番目のステップのコード、検証トークンを入力します

Postman OAuth1アクセスステップ

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

Postman OAuth1アクセス応答

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

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

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

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


Postmanまたは同様のツールを使用したチュートリアルは多数ありますが、CURL機能を使用してプロセス全体を実行するチュートリアル、つまり純粋なPHPコードは見つかりません。それは私が欲しいものです。
MinhTri

@ Dan9 TBHそれは実際には不可能です...少なくともOAuth1ではそうではありません。主にユーザーアカウントでアプリケーションを認証する必要があるからです。他のすべての手順はCURLを使用して簡単に実行できます。問題は、CURLを使用してWordPressユーザーとしてログインすること(つまり、PHPファイルに資格情報を保存する必要があることを意味します)。 OAuth1コードベースを変更することもできますが、正直なところ、CURLを使用してすべてを実行する場合は...これについて間違った方法を考えているので、別の解決策または方法を考え出す必要があります。
sMyles

@ Dan9でやろうとしていることは、主にOAuth2にクライアント資格情報付与タイプなどの新しい機能があるため、OAuth1の代わりにOAuth2サーバーを使用する必要があります。 / oauth2-server-php-docs / grant-types /…
sMyles

@ Dan9 CURLを使用してOAuth1を介してこれを行うことで100%ヘルプを取得することに設定されている場合、いくつかのコードハッキングで可能だと思いますが、前述したように、これはユーザーのUSERNAMEとPASSWORDを保存する必要があることを意味しますPHPファイルに。それとあなたのしている罰金、私は知っているとCURLを使用してそれを行うためのチュートリアルまで病気に書き込みする場合は、あなたがのOAuth2で行くつもりですか、もうこれを必要としない場合は、チュートリアルを書いて時間を費やす必要はありません
sMyles

@ Dan9よく...それだけです... OAuth1を使用する場合は、WordPressユーザーアカウントを関連付ける必要があります。基本的には、アクセストークンをAPIキーのように考えてください...「APIキー」はユーザーアカウントに関連付ける必要があります...セットアップする標準アカウントを使用するかどうかはあなた次第ですが、OAuth1を使用する場合は関係ありませんユーザーアカウントに関連付ける必要があるため、アクセストークンを取得するための時間がかかります。
sMyles

2

これを別の回答として追加して、これを行う方法を理解するのに役立ちます。基本的に私のコメントで述べたように、OAuth1を使用する場合は、ユーザーアカウントに関連付ける必要があります。それを回避する方法はありません。

まず、CURLを使用してWordPressのユーザー名パスワードでサイトにログインし、OAuthへのCURL呼び出しで使用できるようにCookieを保存する必要があります(CURL呼び出しを更新してCookieを含めるようにしてください)。

/programming/724107/wordpress-autologin-using-curl-or-fsockopen-in-php

次に、CURLを使用してクライアントIDとクライアントシークレットを使用してOAuthを呼び出し、一時的なoauthトークンとシークレット(リクエストトークン)を取得します

この呼び出し(およびアクセストークンを取得する呼び出し)を行うには、CURL呼び出しを正しく設定する必要があります。コードとリファレンスについては、この回答の最後をご覧ください。

一時的なoauthトークンとシークレット(リクエストトークン)を取得したら、サイトのこのURLに対してCURL POST呼び出しを行います。

http://website.com/oauth1/authorize

次に、返された認証ページのHTMLからすべての値を取得し、フォームアクションURLに独自のPOSTを送信する必要があります。

/programming/35363815/how-to-get-a-value-input-from-html-returned-of-curl

具体的には、これらをPOSTデータに含めて、「認証」POSTを完了する必要があります。 http://domain.com/wp-login.php?action=oauth1_authorize

  • _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>

検証トークンを取得したら/oauth1/access、検証トークン、oauthトークン、およびoauthトークンシークレットを使用して呼び出しを行うことができます。検証トークンは、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-データ/

OAuth1署名の生成に関するその他のリソース:https ://stackoverflow.com/questions/24613277/oauth-signature-generation-using-hmac-sha1

その他のリソース:http : //collaboradev.com/2011/04/01/twitter-oauth-php-tutorial/


クライアントIDとクライアントシークレットを取得して有効なユーザーに関連付けるにはどうすればよいですか?現在、新しいアプリを作成できるのは管理者のみであり、管理ダッシュボードからのみ作成できます。ところで、私はoauth_signatureあなたが言ったように生成しようとしましたが、どういうわけか、応答は常にjson_oauth1_signature_mismatchです。
-MinhTri

@ Dan9はい、管理者はアプリを作成する必要があります。そうしないと、匿名ユーザーがアプリを作成できるようにする大きなセキュリティ問題になります。署名wordpress.stackexchange.com/questions/185511/… に関するいくつかのサイトを次に 示し
API

0

更新:私が読んだことから、access_tokenを取得するために複数のcurlを実行する必要があり、それを使用してクエリを実行します

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

oauth1サーバーフロー


0

私はこれに少し遅れて来ていることを知っていますが、wp_remote_getと_postを使用できますか?

私はそれらを使用して私のワードプレスのインストールでコンテンツをプルして投稿しています:

これはワードプレスコーデックスの一般的な考え方です。

$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システム次第です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.