已发送JWT token但JWT认证失败,求问题排查方向
Angular请求携带JWT却返回401的排查方案
你的Angular客户端已经在请求头中发送了JWT token,但服务器返回401状态码,你已经在jwt.io上使用密钥验证过该token是有效的,payload如下:
{ "sub": "1-dl/HfaGzfERQfZhLK0X+RPgALQr1vfuHG3hRgJYNwZQFU6NDIAkH54V4BykkwmZCWdvnogzFWn0Kr20PTr0YCM0mUWc=", "iss": "play-silhouette", "exp": 1526458444, "iat": 1526415244, "jti": "b9956c6dea46f108729f97f3742dbea8c0d75053b08aee51d0e4999e0e71d062a48ab0b40b049c6d3709d28d502264b1fd687cf5710c1319513bc95fdcacde5ac5ff41f70cdf404e5591d5ee41a31b7f56c47bb364c9736b36537186b1c9312baf2630f826a3b0c28250501df87a5e0f0e1bbabff2021a834764454f340b260a" }
附上你提供的请求相关截图:

结合你的情况,我整理了几个常见的排查方向,你可以逐一核对:
- 请求头格式是否规范:JWT的标准传递方式是放在
Authorization请求头中,格式为Bearer <你的token>。你需要确认Angular代码里是不是严格按照这个格式设置的——有没有漏加Bearer前缀?头字段名称是不是拼写正确(比如别写成Auth或者其他错误名称)?可以在浏览器开发者工具的Network面板里查看实际发送的请求头,仔细核对这一点。 - token是否完整传输:有时候前端在传递token时,可能因为编码、字符串截断或者存储问题,导致服务器收到的token不完整。你可以把Network面板里看到的请求头中的token,和本地生成的完整token逐字符对比,确保两者完全一致。
- 服务器端验证逻辑的额外约束:虽然你在jwt.io验证token有效,但服务器可能有额外的验证规则:
- 检查
iss(签发者)字段:服务器配置的允许签发者列表里,有没有包含play-silhouette?如果服务器要求签发者必须匹配某个特定值,而你的token里的iss不符合,就会返回401。 - 检查
exp(过期时间):确认服务器的系统时间和你本地时间是否同步?如果服务器时间比你本地快,可能会误判token已经过期。你可以计算下exp对应的时间(1526458444转换成北京时间是2018-05-16 10:54:04),对比服务器当前时间看看是否在有效期内。 - 验证密钥是否完全一致:服务器端用于验证JWT的密钥,是不是和你在jwt.io使用的密钥完全相同?要注意密钥的大小写、特殊字符、空格等细节,哪怕一个字符错了都会验证失败。
- 检查
- 跨域请求的CORS配置问题:如果你的Angular客户端和服务器不在同一个域名下,需要确认服务器的CORS配置是否允许携带
Authorization头。服务器的Access-Control-Allow-Headers设置里必须包含Authorization,否则浏览器会拦截这个头,不会发送给服务器。 - 目标接口的权限配置:确认你请求的服务器接口,是不是允许当前token对应的用户访问?比如接口有没有角色权限限制,而你的token payload里没有包含对应的角色声明,或者用户权限不足。
内容的提问来源于stack exchange,提问作者Manu Chadha
相关产品推荐
相关产品推荐

