社交应用所有端点JWT授权失败,创建帖子接口报错401求助
JWT身份验证导致所有接口返回401错误的排查
问题描述
我正在开发一款社交媒体应用,使用JWT Token对所有接口进行身份验证,但所有端点均返回自定义错误“You are not authorized, Error 401”。以创建帖子接口为例:
- 挂载
verifyUser中间件时,接口返回401错误 - 移除
verifyUser中间件后,接口可正常工作 - 已尝试重新登录生成新Cookie,问题仍未解决
相关代码
JWT验证代码
const jwt = require("jsonwebtoken") const { createError } = require("../utils/error.js") const verifyToken = (req, res, next) => { const token = req.cookies.access_token if(!token) { return next(createError(401,"You are not authenticated!")) } jwt.verify(token, process.env.JWT_SECRET, (err, user) => { if(err) return next(createError(401,"Token is not valid!")) req.user = user next() }) } const verifyUser = (req, res, next) => { verifyToken(req, res, () => { if(req.user.id === req.params.id || req.user.isAdmin) { next() } else { return next(createError(402,"You are not authorized!")) } }) } const verifyAdmin = (req, res, next) => { verifyToken(req, res, next, () => { if (req.user.isAdmin) { next(); } else { return next(createError(403, "You are not authorized!")); } }); }; module.exports = {verifyToken, verifyUser, verifyAdmin}
创建帖子接口代码
const createPost = async (req, res) => { const newPost = new Post(req.body); try { const savedPost = await newPost.save(); res.status(200).json(savedPost); } catch (err) { res.status(500).json(err); } }
路由配置
// create a post router.post("/", verifyUser, createPost);
可能的原因及解决方案
1. 未配置cookie-parser中间件
req.cookies.access_token能正确获取值的前提是项目中已引入并配置cookie-parser。如果没配置,req.cookies会是空对象,verifyToken会直接返回401错误。
解决方法:
- 安装依赖:
npm install cookie-parser - 在项目入口文件中引入并使用:
const cookieParser = require('cookie-parser'); app.use(cookieParser());
2. verifyAdmin中间件参数传递错误
verifyAdmin调用verifyToken时传了4个参数,但verifyToken只接受req, res, next三个参数,导致回调函数无法执行,可能引发中间件逻辑混乱。
解决方法:修改verifyAdmin代码,将回调作为第三个参数传给verifyToken:
const verifyAdmin = (req, res, next) => { verifyToken(req, res, () => { if (req.user.isAdmin) { next(); } else { return next(createError(403, "You are not authorized!")); } }); };
3. verifyUser中间件逻辑不适用于创建帖子接口
创建帖子的路由是POST /,没有req.params.id,所以req.user.id === req.params.id这个条件永远不成立。如果当前用户不是管理员,会返回402错误,但你遇到的401说明问题主要出在verifyToken阶段,不过该逻辑问题也需要修正。
解决方法:
- 如果创建帖子仅需验证用户已登录,直接用
verifyToken代替verifyUser:
router.post("/", verifyToken, createPost);
- 如果需要限制特定用户创建,可调整逻辑从请求体获取用户ID进行验证。
4. JWT签名密钥不匹配
确保process.env.JWT_SECRET的值与生成Token时使用的密钥完全一致,密钥不匹配会导致jwt.verify失败,返回401错误。
解决方法:检查.env文件中的JWT_SECRET配置,确认和登录接口生成Token时使用的密钥相同。
内容的提问来源于stack exchange,提问作者Dragut
相关产品推荐
相关产品推荐

