JWT令牌验证问题:verifyAdmin中间件始终返回403错误
问题:请求始终触发verifyAdmin的403错误
调用路由时,请求总是进入verifyAdmin中间件的else分支,返回403状态码和"You are not alowed to do that!"提示。终端无报错,但Postman测试每次都触发该分支。
问题根源分析
查看令牌生成代码,生成JWT时仅传入了id字段:
const token = jwt.sign({ id: user.id }, secret, { expiresIn: process.env.EXPIRES_TOKEN, })
而verifyAdmin中间件需要通过req.users.isAdmin判断权限,但req.users是从JWT解析出的数据,其中根本没有isAdmin字段,因此必然进入else分支返回403。
解决方案
1. 修改令牌生成代码,加入isAdmin字段
在生成JWT时,将用户的isAdmin属性也存入token:
const token = jwt.sign({ id: user.id, isAdmin: user.isAdmin // 新增该字段 }, secret, { expiresIn: process.env.EXPIRES_TOKEN, })
2. 可选优化:增强verifyAdmin的容错性
在verifyAdmin中增加字段存在性判断,避免因req.users.isAdmin不存在导致的异常:
const verifyAdmin = (req, res, next) => { if (req.users?.isAdmin === true) { next(); } else { return res.status(403).json("You are not allowed to do that!"); } };
3. 重新生成令牌并测试
修改代码后,重新登录获取新的令牌,使用该令牌在Postman中测试接口,即可正常通过verifyAdmin验证。
内容的提问来源于stack exchange,提问作者Routfin
相关产品推荐
相关产品推荐

