为什么Express JWT授权场景下token请求头无法被读取,req.user为undefined?
问题原因排查及解决方案
- 先确认JWT签发逻辑的结构是否正确
如果你能走到dashboard路由的console.log(req.user)步骤,说明authorization中间件已经通过了token校验,没有触发403返回,问题出在jwt校验后的返回值结构不符合预期:你在中间件里给req.user赋值的是verify.user,如果签发JWT时的payload没有套user外层字段,verify返回的对象里就不存在user属性,自然输出undefined。
正确的JWT签发示例参考:
你可以在authorization中间件的try分支里加一行// 签发时必须套user外层字段,和中间件的取值逻辑对应 const token = jwt.sign( { user: { id: 用户ID, email: 用户邮箱 } }, process.env.jwtSecret, { expiresIn: '24h' } )console.log(verify),直接看校验后的返回值结构就能快速定位该问题。 - 检查请求头传递是否匹配
请求头键名大小写完全敏感,你中间件里读取的是req.header('token'),客户端传递时必须严格用token作为请求头的键名,如果写为Token、TOKEN或者标准的Authorization都无法被正常读取。如果请求头没有正确传递,中间件会直接返回403,不会走到路由层的打印逻辑。 - 排查dotenv配置是否正确
确认项目根目录存在.env文件,且jwtSecret配置项的拼写和值和你签发JWT时用的密钥完全一致,密钥不匹配会触发jwt校验报错,走catch分支返回403。
内容的提问来源于stack exchange,提问作者Steve Larsen
相关产品推荐
相关产品推荐

