验证WordPress REST API JWT令牌时出现jwt_auth_no_auth_header错误

Aka*_*shi 13 authentication rest wordpress jwt

我有两个AWS实例,一个用于WordPress网站,另一个用于React应用程序.为了将它们连接在一起,我使用"WP REST API - OAuth 1.0a服务器"和"用于WP-API的JWT身份验证"来访问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
  }
}
Run Code Online (Sandbox Code Playgroud)

我抬起头,发现了一些要添加的东西.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
Run Code Online (Sandbox Code Playgroud)

我添加了以下代码,以查看请求中是否存在任何授权标头但没有任何授权标头

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;
}
Run Code Online (Sandbox Code Playgroud)

在这里(https://github.com/Tmeister/wp-api-jwt-auth/issues/6)我读到WordPress可能正在尝试通过cookie方法进行身份验证,默认情况下会抛出错误并且没有达到JWT身份验证,所以我添加了这段代码但仍然没有成功

add_filter( 'rest_authentication_errors', '__return_true' );
Run Code Online (Sandbox Code Playgroud)

最后我添加了"JSON基本身份验证"插件,它也在Headers中发送用户名:密码,它可以工作.所以我不确定Headers被剥离是否是一个问题.因为不推荐用于生产服务器,所以我需要JWT身份验证才能工作.

任何帮助表示赞赏.

小智 17

我遇到了同样的问题,直到我更改了htaccess上的行顺序.最初,我把线条

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

在规则的最后.

在那些仅在RewriteEngine On之后的行之后,错误jwt_auth_no_auth_header被修复.关于wp rest api的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>
Run Code Online (Sandbox Code Playgroud)


Aka*_*shi 7

如果其他人遇到此问题,我添加的此代码.htaccess可能无法正常工作

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

所以在插件文件中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;
}
Run Code Online (Sandbox Code Playgroud)

这将获得该Authorization标头和JWT将按预期工作

  • 谢谢@steveKim!更新的答案. (2认同)