【问题标题】:jwt_auth_no_auth_header error on validating WordPress REST API JWT token验证 WordPress REST API JWT 令牌时出现 jwt_auth_no_auth_header 错误
【发布时间】:2017-11-03 12:10:24
【问题描述】:

我有两个 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
  }
}

我查了一下,发现很少有东西可以添加到.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' );

最后我添加了“JSON 基本身份验证”插件,该插件还在标题中发送用户名:密码并且它可以工作。所以我不确定标题被剥离是否有问题。由于不推荐用于生产服务器,所以我需要 JWT 身份验证才能工作。

感谢任何帮助。

【问题讨论】:

    标签: wordpress rest authentication jwt


    【解决方案1】:

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

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

    在规则的末尾。

    在那些仅在 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>
    

    【讨论】:

    • 这可行,但 WordPress 会自动修改我的 htacces
    • 那太好了,节省了我的一天。感谢您。我做了很多次,对这个重要的配置一无所知
    【解决方案2】:

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

    【讨论】:

    • 这对我帮助很大。为避免未定义索引错误,您可以执行以下操作:$auth = isset($allHeaders['AUTHORIZATION']) ? $allHeaders['AUTHORIZATION'] : false;
    • 谢谢@steveKim!更新了答案。
    • 请注意,在 Nginx、PHP-FPM 或任何其他运行 PHP 的 FastCGI 方法中不存在 getallheaders() 函数。它可以填充。见stackoverflow.com/a/41427998/1298923
    猜你喜欢
    • 1970-01-01
    • 2021-09-04
    • 2022-12-15
    • 2020-02-28
    • 2020-07-12
    • 2021-06-27
    • 2019-08-04
    • 2019-06-23
    • 1970-01-01
    相关资源
    最近更新 更多