方法:Wordpress APIに対してJWT認証のリクエストを行う


17

これは実際には質問ではなく、JWTを使用してWordpress APIに対して認証されたリクエストを行う方法に関するガイドです。私はこれを自分自身へのリマインダーとして、また同じトピックに関するヘルプが必要な人のために書いています。


3
これを質問としてフォーマットし、実際の回答としてソリューションを投稿してください。それ以外の場合は、未回答の質問のように見えます。
ジェイコブピーティー

2
この素晴らしいガイドもありますfirxworx.com/blog/wordpress/…–
アルマンド

回答:


19

JWT認証を使用する理由

バックエンドとしてWordpressを使用し、フロントエンドとしてReact + Reduxアプリを使用するサイトを構築しているため、Wordpress APIにリクエストを送信して、フロントエンドのすべてのコンテンツをプルします。一部のリクエスト(主にPOSTリクエスト)を認証する必要があります。これは、JWTに遭遇したときです。

私たちの必要なもの

WordpressでJWT認証を使用するには、まずWP REST APIプラグインの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のデフォルトの「インデックス」にリクエストを送信します。

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

「認可」タブで「認証なし」を選択し、「ヘッダー」タブに次を追加します。

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

最後に、[ボディ]タブで、未加工およびJSON(application / json)オプションを選択し、オプションの下のエディターで次のように入力します。

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

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


2
バックエンドで認証される必要がないコールと認証される必要があるコールをどのように区別しますか?
ウルク

また、WordPress REST APIを使用してWordPressデータベースから投稿データをプルするReactアプリも作成していますが、REST APIエンドポイントを公開することは望ましくありません。Reactアプリ以外にREST APIへのアクセスを制限する方法はありますか?
クリス

@chrisエンドポイントを承認されていないリクエストから隠したい場合は、名前空間jwt_authに追加しますregister_rest_route( 'jwt-auth/v1', 'your_custom_endpoint ... 。/ jwt-auth /の下にあるものはすべて承認が必要です
Athoxx

3

@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()関数によって返されるトークンです。

個人的にプラグイン「REST APIを無効にし、JWT / OAuth認証を要求する」を使用して、上記のトークンでのみAPIアクセスを制限します。

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