web-dev-qa-db-ja.com

方法:Wordpress APIに対してJWT認証要求を送信する

これは実際には問題ではありませんが、JWTを使用してWordpress APIに認証された要求を送信する方法に関するガイドです。私はこれを私自身と同じトピックに関して何らかの助けを必要とするかもしれない人々への思い出させるものとして書いています。

14
grazianodev

なぜJWT認証

私は、バックエンドとしてWordpressを使用し、フロントエンドとしてReact + Reduxアプリを使用するサイトを構築しています。そのため、フロントエンドのすべてのコンテンツをWordpress APIへのリクエストによって取得します。いくつかの要求(主に、POST要求)は認証される必要があります。それは私がJWTに出くわしたときです。

必要なもの

WordpressでJWT認証を使用するには、まず WP REST AP​​IのJWT認証 プラグインをインストールする必要があります。プラグインの指示で説明されているように、私たちはいくつかのコアWordpressファイルも修正する必要があります。特に:

Wordpressインストールのルートフォルダに含まれている.htaccessファイルに、以下の行を追加する必要があります。

RewriteEngine on
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]

Wordpressインストールのルートフォルダにも含まれているwp-config.phpファイルに、次の行を追加する必要があります。

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); // Replace 'your-top-secret-key' with an actual secret key.
define('JWT_AUTH_CORS_ENABLE', true);

JWTが利用可能かどうかを確認するためのテスト

JWTを使用できるようになったことを確認するには、Postmanを起動してWordpress APIのデフォルトの 'index'にリクエストを送信します。

http://example.com/wp-json/

/jwt-auth/v1/jwt-auth/v1/tokenなど、いくつかの新しいエンドポイントがAPIに追加されているはずです。上記の要求への応答でそれらを見つけることができれば、JWTが利用可能になったことを意味します。

JWTトークンの取得

しばらくPostmanに滞在して、Wordpress APIへのトークンをリクエストしましょう。

http://example.com/wp-json/jwt-auth/v1/token

応答にはJWTトークンが含まれます。これは、次のような暗号化された鍵です。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9sb2NhbGhvc3Q6ODg4OFwvZm90b3Jvb20tbmV4dCIsImlhdCI6MTUyMjU5NzQ1MiwibmJmIjoxNTIyNTk3NDUyLCJleHAiOjE1MjMyMDIyNTIsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.hxaaT9iowAX1Xf8RUM42OwbP7QgRNxux8eTtKhWvEUM

認証リクエストを行う

JWTで認証されたリクエストの例として、IDが300の投稿のタイトルを変更してみましょう。

Postmanで、メソッドとしてPOSTを選択し、次の終点を入力します。

http://example.com/wp-json/wp/v2/posts/300

[Authorization]タブで[No Auth]を選択し、[Headers]タブに次の行を追加します。

'Content-type': 'application/json', 
'Authorization': 'Bearer jwtToken' // Replace jwtToken with the actual token (the encrypted key above)

最後に、「Body」タブで、「raw」オプションと「JSON(application/json)」オプションを選択し、次にエディタのオプションのすぐ下に次のように入力します。

{ "title": "YES! Authenticated requests with JWT work" }

これでSENDを押すことができます。レスポンスタブで、リクエストした投稿に関するすべてのデータを確認します。タイトルキーの値はYES! Authenticated requests with JWT workになります。

16
grazianodev

@ grazianodevの答えを補足すると、これはcURLを使用して認証トークンを取得する方法です。

/**
*   Generate a JWT token for future API calls to WordPress
*/
private function getToken() {
    $ch = curl_init();

    curl_setopt($ch, CURLOPT_URL,'https://site.localhost/wp-json/jwt-auth/v1/token');
    curl_setopt($ch, CURLOPT_POST, 1);

    # Admin credentials here
    curl_setopt($ch, CURLOPT_POSTFIELDS, "username=admin&password=Str0ngPass"); 

    // receive server response ...
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);

    $server_output = curl_exec ($ch);
    if ($server_output === false) {
        die('Error getting JWT token on WordPress for API integration.');
    }
    $server_output = json_decode($server_output);

    if ($server_output === null && json_last_error() !== JSON_ERROR_NONE) {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }

    if (!empty($server_output->token)) {
        $this->token = $server_output->token; # Token is here
        curl_close ($ch);
        return true;
    } else {
        die('Invalid response getting JWT token on WordPress for API integration.');
    }
    return false;
}

その後、ヘッダに "Authorization:Bearer $ token"を付けてリクエストを送信します。

$ tokenは上記のgetToken()関数によって返されるトークンです。

私は個人的にプラグイン " Disable REST AP​​IとRequire JWT/OAuth Authentication "を使用して、上記のトークンでのみAPIアクセスを制限しています。

3