web-dev-qa-db-ja.com

検証時のjwt_auth_no_auth_headerエラーWordPress REST APIJWTトークン

2つのAWSインスタンスがあります。1つはWordPressウェブサイト用、もう1つはReactアプリケーション用です。これらを接続するには、「WP REST API-OAuth 1.0aServer "および" JWT Authentication for WP-API "for access WP REST API。

/wp-json/jwt-auth/v1/tokenでトークンを生成できますが、他のエンドポイントにアクセスしようとした場合、または/wp-json/jwt-auth/v1/token/validateでトークンを検証しようとすると、次のエラーが発生します。

{
  "code": "jwt_auth_no_auth_header",
  "message": "Authorization header not found.",
  "data": {
    "status": 403
  }
}

調べてみると、.htaccessに追加するものがいくつか見つかりました。見つけたものをすべて追加しましたが、成功しませんでした。

RewriteEngine On
RewriteBase /

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

# WordPress
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

# For SetEnvIf Authorization
#RewriteRule (.*) - [env=myenv:1]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
#SetEnvIf Authorization .+ HTTP_AUTHORIZATION=$0

次のコードを追加して、リクエストに承認ヘッダーが存在するかどうかを確認しましたが、存在しません

add_filter( 'rest_pre_dispatch', 'prefix_show_request_headers', 10, 3 );
function prefix_show_request_headers( $result, $server, $request ) {
    $result = $request->get_headers();
    return $result;
}

ここで( https://github.com/Tmeister/wp-api-jwt-auth/issues/6 )私はWordPressがおそらく経由で認証しようとしているデフォルトではcookieメソッドであり、エラーをスローし、JWT認証に到達していないため、このコードを追加しましたが、それでも成功しません

add_filter( 'rest_authentication_errors', '__return_true' );

最後に、ヘッダーでusername:passwordも送信する「JSON基本認証」プラグインを追加しました。これは機能します。したがって、ヘッダーが削除されている問題かどうかはわかりません。本番サーバーには推奨されないため、JWT認証が機能する必要があります。

どんな助けでも大歓迎です。

13
Akash Joshi

他の誰かがこの問題に直面した場合、私が.htaccessに追加したこのコードはおそらく機能していません

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

したがって、プラグインファイルjwt-authentication-for-wp-rest-api/class-jwt-auth-public.phpで、validate_tokenという名前の関数を調べ、$authチェックが失敗した後、次のコードを追加しました。

if (!$auth) {
    $allHeaders = getallheaders();
    $auth = isset($allHeaders['Authorization']) ? $allHeaders['Authorization'] : false;
}

これにより、Authorizationヘッダーが取得され、JWTは期待どおりに機能します

7
Akash Joshi

Htaccessの行の順序を変更するまで、同じ問題に直面していました。最初に、私は行を置きます

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

ルールの終わりに。

RewriteEngineがオンになった後のみ、エラーjwt_auth_no_auth_headerが修正された行の後。 wp restapiのjwt認証について

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
17
Marcos