调用消息API时Postman报‘Not authorized, token failed’错误的排查
问题分析与解决
旧token是否还能使用?
基本不能用了。你的authMiddleware.js中,jwt.verify(token, process.env.JWT_SECRET)验证失败时会抛出该错误,常见原因包括:
- token过期:你生成token时设置了
expiresIn: "30d"(见generateToken函数),如果上周获取的token至今已超过30天,会直接验证失败。可以在终端执行以下命令查看token过期时间:// 用node.js解码token const jwt = require('jsonwebtoken'); const decoded = jwt.decode('你的旧token'); console.log(new Date(decoded.exp * 1000)); // 转换为本地时间 - JWT_SECRET变更:如果服务器的
process.env.JWT_SECRET和生成该token时的密钥不一致,验证会失败。比如部署时重新配置了环境变量,或者本地.env文件被修改。 - token被篡改:如果token内容被手动修改过,也会触发验证失败。
如何生成新token?
你的项目中generateToken函数是在用户登录流程中调用的,生成新token的步骤如下:
- 调用项目的登录API(比如
/api/users/login),传入正确的用户名和密码。 - 登录接口验证用户身份后,会调用
generateToken(user._id)生成新的JWT token,并返回给客户端。 - 在Postman中,将新token填入请求头的
Authorization字段,格式为Bearer 新获取的token,再调用消息API即可。
额外排查建议
- 检查Postman请求头:确保
Authorization字段拼写正确,Bearer与token之间有且仅有一个空格。 - 确认JWT_SECRET一致性:可以在代码中临时添加
console.log(process.env.JWT_SECRET)(上线前务必删除),对比生成token时使用的密钥。 - 验证用户存在性:如果生成旧token的用户在数据库中已被删除,
User.findById(decoded.id)会返回null,也可能间接导致验证失败。
内容的提问来源于stack exchange,提问作者Worlorn
相关产品推荐
相关产品推荐

