验证WordPress REST API JWT标记时出现jwt_auth_no_auth_header错误

lmvvr0a8  于 2022-11-22  发布在  WordPress
关注(0)|答案(3)|浏览(177)

我有两个AWS示例,一个用于WordPress网站,另一个用于React应用程序。为了将它们连接在一起,我使用“WP REST API - OAuth 1.0a服务器”和“JWT验证WP-API”访问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

我添加了以下代码,以查看请求中是否存在任何Authorization Header,但实际上没有

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' );

最后我添加了“JSON基本认证”插件,它也在头中发送用户名:密码,它工作了。所以我不确定这是否是头被剥离的问题。因为它不建议用于生产服务器,所以我需要JWT认证工作。
任何帮助都是感激不尽的。

4sup72z8

4sup72z81#

我也遇到了同样的问题,直到我改变了htaccess上的行的顺序。

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

在规则的最后。
在RewriteEngine On之后的那些行之后,修复了错误jwt_auth_no_auth_header。

<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>
y1aodyip

y1aodyip2#

如果其他人遇到这个问题,我添加到.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将按预期工作

hrysbysz

hrysbysz3#

我尝试了上面提到的所有,并没有成功地使它工作,直到我检查我安装的插件,我发现我有两个插件:一个名为“JWTAuth”,另一个名为:“WP-API的JWT身份验证”。当我取消激活“JWT身份验证”时,一切都正常。我不知道原因,但似乎两者之间存在某种冲突。

相关问题