为什么集成JWT鉴权后我的API接口无响应也不返回错误?
问题原因及修复方案
1. 鉴权中间件未正确调用
你定义的authJwt是返回express-jwt实例的工厂函数,直接将函数本身传给app.use不会生效,请求会卡在中间件环节无响应,修正index.js中的注册代码:
const authJwt = require('./helpers/jwt'); // 执行authJwt()拿到中间件实例再注册 app.use(authJwt());
2. 未排除无需鉴权的公开接口
全局注册鉴权中间件后,所有接口都会校验JWT,包括/login登录接口,会导致你无法先调用登录接口拿到token,需要在初始化express-jwt时配置白名单:
修改jwt.js代码:
const expressJwt = require('express-jwt'); const authJwt = () => { const secret = process.env.secret_key; return expressJwt({ secret, algorithms: ['HS256'] }).unless({ // 在这里添加不需要鉴权的路径,和你实际的路由前缀对应即可 path: [ '/api/users/login', // 其他公开接口比如注册、静态资源路径也可以加在这里 ] }) } module.exports = authJwt;
3. 缺失JWT错误处理中间件
如果JWT校验不通过(比如token过期、伪造、未传),express-jwt会抛出错误,你没有配置错误处理中间件的话,请求就会挂起无返回,在index.js所有路由注册的末尾添加错误处理:
// 所有其他中间件、路由注册完成后添加 app.use((err, req, res, next) => { // 专门处理jwt鉴权错误 if (err.name === 'UnauthorizedError') { return res.status(401).json({message: '无效的身份凭证,访问被拒绝'}) } // 通用错误返回 res.status(err.status || 500).json({message: err.message}) })
4. Postman测试规范
修复后调用需要鉴权的接口时,需要在请求头中添加Authorization字段,值格式为Bearer <你登录接口拿到的token>,注意Bearer和token之间要有一个空格。
内容的提问来源于stack exchange,提问作者fyardlest
相关产品推荐
相关产品推荐

