本地WordPress使用JWT调用REST API时出现invalid_username错误
从你描述的情况来看,核心问题是JWT令牌没有被正确解析,反而被拆成类似用户名({"typ")和密码("JWT","alg")的片段传到了wp_authenticate_username_password函数里,这说明请求的认证方式或服务器配置出了问题,导致JWT插件无法正常读取并解析令牌。
以下是针对性的排查和解决步骤:
1. 检查请求的Authorization头格式
确保调用API时,请求头的Authorization字段严格遵循Bearer <token>格式:
- 在Postman中,选择
Authorization标签,类型选Bearer Token,直接在Token输入框粘贴你的JWT令牌(避免手动拼接字符串导致格式错误)。 - 手动构造请求头的话,要确保值是
Bearer(注意末尾有空格)加上完整的token,示例:
不要用Basic认证方式传递JWT,也不要把token拆分成username和password字段放在请求体或URL里。Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX2lkIjoiMSIsInVzZXJuYW1lIjoiYWRtaW4iLCJpYXQiOjE2OTYwMTMxMDAsImV4cCI6MTY5NjA0OTEwMH0.xxxxxx
2. 修复服务器的Authorization头传递配置
JWT插件需要服务器将Authorization头正确传递给PHP,否则插件无法读取令牌,会触发错误的认证逻辑:
Apache服务器(.htaccess)
在WordPress根目录的.htaccess文件中,添加以下规则(放在默认WordPress Rewrite规则之前):
RewriteEngine On RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
Nginx服务器
在站点的Nginx配置文件中,找到location ~ \.php$块,添加:
fastcgi_pass_header Authorization;
修改后重启服务器生效。
3. 确认JWT插件的基础配置
尽管你能生成token,仍需确认wp-config.php里的配置正确:
// 替换成随机密钥(可用openssl rand -hex 32生成) define('JWT_AUTH_SECRET_KEY', 'your-random-secret-key-here'); // 跨域调用时开启CORS define('JWT_AUTH_CORS_ENABLE', true);
确保密钥是足够长的随机字符串,不要用默认值或简单字符串。
4. 排查插件冲突
暂时禁用所有其他插件,只保留JWT Authentication for WP REST API和WordPress核心功能,再测试API调用。如果问题消失,逐个启用插件,找到冲突的那个并处理(更新插件或替换替代插件)。
5. 检查PHP函数可用性
部分服务器环境会禁用apache_request_headers()函数,导致JWT插件无法获取Authorization头。可以创建测试php文件验证:
<?php var_dump(apache_request_headers()); ?>
访问该文件,查看输出是否包含Authorization头。如果没有,联系服务器管理员开启该函数,或在php.ini中移除apache_request_headers的禁用项。
内容的提问来源于stack exchange,提问作者jsalita

