Spring Boot中JWT令牌验证失败问题排查求助
核心问题场景
向http://localhost:8080/auth/signup发送POST请求成功注册,获取到JWT令牌与"Register Success"提示;但使用该令牌通过Bearer Token方式请求http://localhost:8080/api/users/12时,返回500错误,提示"Invalid token …",控制台抛出org.springframework.security.authentication.BadCredentialsException异常。
针对性排查步骤
验证JWT生成与校验的密钥一致性
检查JwtConstant.java中定义的签名密钥(如JWT_SECRET),确保JwtProvider.java生成令牌时使用的密钥,和JwtValidator.java校验令牌时使用的密钥完全一致,包括大小写、特殊字符、空格等,哪怕一个字符不同都会导致校验失败。检查JWT令牌的解析逻辑
- 在
JwtProvider.java中确认生成令牌时是否正确写入了用户标识(如用户ID、用户名),且JwtValidator.java在校验时是否正确读取这些字段; - 验证令牌的过期时间设置,若注册后令牌立即过期,也会触发无效提示,可在生成令牌时延长过期时间测试(比如设置为1天)。
- 在
确认Bearer Token的请求格式
在Postman中检查Authorization头部的格式是否正确:必须是Bearer [空格]令牌内容,不能有多余的空格、换行,也不能遗漏"Bearer"前缀。可以直接复制令牌到https://jwt.io/解析,确认令牌的payload、签名是否正常,若解析失败则说明令牌生成过程有问题。排查用户信息关联逻辑
检查CustomerUserDetailsService.java的loadUserByUsername(或对应方法)是否能根据令牌中的用户标识正确查询到用户信息,若查询返回null或用户状态异常(如禁用),会触发BadCredentialsException。检查Spring Security配置与异常处理
- 查看
AppConfig.java中的Security过滤器链配置,确认JwtValidator是否被正确添加到过滤器链中,且顺序是否在UsernamePasswordAuthenticationFilter之前; - 检查是否有自定义的异常处理器错误捕获了
BadCredentialsException但未正确处理,导致返回500而非401,建议在异常处理器中明确将该异常映射为401 Unauthorized响应。
- 查看
添加详细日志定位问题
在JwtValidator.java和JwtProvider.java中添加日志,打印生成的令牌内容、校验时的令牌内容、密钥信息、解析后的用户信息等,通过控制台日志确认哪一步出现了不匹配。
内容的提问来源于stack exchange,提问作者parodiathe

