WordPress JWT - 错误验证 (401)

Posted

技术标签:

【中文标题】WordPress JWT - 错误验证 (401)【英文标题】:WordPress JWT - Error authentification (401) 【发布时间】:2019-07-15 03:07:55 【问题描述】:

我不久前才发现 WordPress,在使用带有自定义端点的 JWT 时遇到了一些问题。

确实,在正确配置了我的 API 和 JWT 之后,我在 AJAX 请求期间遇到了身份验证问题。

我觉得奇怪的是我使用 Postman 没有问题。所以我认为这是一个WordPress配置问题...

这里是我的代码概述,我已对其进行了精简,并在此场合尽可能清晰。

JWT 的配置:

(.htaccess)

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

(wp-config.php)

...
define('JWT_AUTH_SECRET_KEY', 'secretKey...');
define('JWT_AUTH_CORS_ENABLE', true);
...

Ajax(在我的插件文件夹中)

jQuery.ajax(
        url: url + '/wp-json/test/v1/test_users' + order,
        type: 'GET',
        headers: 
        
            'Content-Type': 'application/json',
            'Authorization': 'Bearer myToken...'
        ,

        success: function(data) 
            alert('success');
        ,

        error : function(data) 
            alert(JSON.stringify(data));
        
    );

端点(在我的孩子主题中)

add_action( 'rest_api_init', function () 
            register_rest_route( 'test/v1', '/test_users', array(
                'methods' => 'GET',
                'callback' => array($this, 'get_users'),
                'permission_callback' => function () 
                    return Routes::test_authorized(5);
                
            ) );
        );

public static function test_authorized($group)

    global $wpdb;
    $current_user = wp_get_current_user();

    if (empty($current_user))
        return false;

    $user = ...

       ...

    if (empty($user) || $user == null || $user->test_group > $group)
        return false;

    return true;

随机数

add_action('rest_api_init', function () 
            add_filter('jwt_auth_token_before_dispatch', function ($data, $user) 
            // Tells wordpress the user is authenticated
            wp_set_current_user($user->ID);
            $data['nonce'] = wp_create_nonce('wp_rest');
            return $data;
            , 10, 2);
        );

谢谢!

编辑:

错误信息:

"readyState":4,"responseText":""code":"rest_forbidden","message":"对不起, 你不被允许做 那个。","data":"status":401","status":401,"statusText":"Unauthorized"

我刚刚做了一个测试:

public static function test_authorized($group)

        [...]

        echo '----------' . $current_user->user_nicename . '--------';

        [...]

这就是答案:

"readyState":4,"responseText":"---------------------------"code":"rest_forbidden" ”消息”:“对不起, 你不被允许做 那个。","data":"status":401","status":401,"statusText":"Unauthorized"

所以我的印象是用户在添加过滤器时没有很好地设置。但是为什么它对邮递员有用......?

【问题讨论】:

您介意告诉我们问题出在哪里吗?有没有给出任何错误信息? "readyState":4,"responseText":""code":"rest_forbidden","message":"Sorry, you are not allowed to do that.","data":"status":401","status":401,"statusText":"Unauthorized" 我刚刚做了一个测试:public static function test_authorized($group) global $wpdb; $current_user = wp_get_current_user(); echo '----------' . $current_user-&gt;user_nicename . '--------'; [...] 这是答案:"readyState":4,"responseText":"................"code":"rest_forbidden","message":"Sorry, you are not allowed to do that.","data":"status":401","status":401,"statusText":"Unauthorized" 所以我的印象是用户在添加过滤器时设置得不好。但是为什么它对邮递员有用......? @AlinoëRuntz 单击编辑以将错误消息和任何其他信息放入您的问题中。 【参考方案1】:

请确保您已在 htaccess 文件中添加以下代码

RewriteCond %HTTP:Authorization ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

【讨论】:

以上是关于WordPress JWT - 错误验证 (401)的主要内容,如果未能解决你的问题,请参考以下文章

ASP.NET Core JWT 身份验证以保护 webAPI [Authorize] 属性错误 401 Unauthorized

401/405 错误 Symfony 4 REST:Docker 上的 JWT API 身份验证(LexikJWTAuthenticationBundle)-ngnix

尝试访问我的 api 平台时未找到 JWT 令牌 401 错误?

.NET Core 中的 JWT 授权——401 错误

护照-jwt 总是返回 401 未授权

通过 Axios 和有效 JWT 发布时,WordPress REST API 返回 401 Unauthorized