如何在WordPress中为自定义端点绕过JWT授权?
解决JWT插件干扰WordPress应用密码Basic认证的问题
问题分析
你遇到的jwt_auth_bad_auth_header错误,根源在于JWT Authentication for WP-API插件会优先拦截所有REST请求的Authorization头,而WordPress应用密码的Basic认证格式(Basic <token>)不符合JWT要求的Bearer <token>格式,因此被判定为无效头。直接修改插件核心方法的做法不可取——插件更新后修改会被覆盖,正确方式是利用插件提供的过滤器钩子实现端点级别的绕过。
解决方案
使用JWT插件内置的jwt_auth_should_authenticate过滤器,针对你的自定义端点跳过JWT认证流程,让WordPress的应用密码Basic认证正常生效。
具体代码实现
在主题functions.php或自定义插件中添加以下代码:
// 针对指定自定义端点跳过JWT认证 add_filter('jwt_auth_should_authenticate', function($should_authenticate) { // 获取当前REST请求对象 $request = rest_get_server()->get_current_request(); if (!$request) { return $should_authenticate; } // 匹配你的自定义端点路由 $target_route = '/myapi/myendpoint'; $current_route = $request->get_route(); // 如果是目标端点,返回false跳过JWT认证 if ($current_route === $target_route) { return false; } return $should_authenticate; }); // 你的自定义端点注册代码(保持不变) add_action('rest_api_init', function() { register_rest_route( 'myapi', 'myendpoint', [ 'methods' => 'POST', 'callback' => 'my_api_callback', 'permission_callback' => function () { return current_user_can('administrator'); } ] ); });
代码说明
jwt_auth_should_authenticate过滤器由JWT插件提供,返回false时会跳过JWT的认证流程。- 通过
rest_get_server()->get_current_request()获取当前请求对象,调用get_route()方法获取请求路径,与你的自定义端点路由对比。 - 匹配成功时返回
false,JWT插件不再处理该请求的Authorization头,WordPress会自动处理应用密码的Basic认证,你的permission_callback也能正常通过current_user_can验证用户权限。
验证方式
发送请求时使用应用密码的Basic认证格式(Authorization: Basic <base64编码的用户名:应用密码>),此时请求会绕过JWT认证,直接由WordPress验证应用密码,返回正常接口响应。
内容的提问来源于stack exchange,提问作者Salih K
相关产品推荐
相关产品推荐

