Node.js JWT认证接口返回403 Forbidden问题求助
解决JWT认证返回403 Forbidden的问题
问题根源
- Token传递方式不匹配:你的
verifyToken函数是从请求头req.headers["authorization"]获取认证信息,但你在Postman里是通过**查询参数authorisation**传递的token,导致函数拿不到有效token,直接返回403。 - 重复发送响应:在
/api/posts的错误分支中,先调用res.sendStatus(403)已经完成响应发送,之后再调用res.send会触发Cannot set headers after they are sent to the client错误,属于不规范写法。
解决方案
方案1:改用请求头传递token(推荐,符合REST安全规范)
- 在Postman的Headers标签中添加:
- 键:
Authorization - 值:
Bearer 你的token内容(注意Bearer和token之间有空格)
- 键:
- 修正重复响应的问题,修改
/api/posts路由代码:
app.post('/api/posts', verifyToken, (req, res) => { jwt.verify(req.token, "secretkey", (err, authData) => { if (err) { // 统一发送一次响应,携带错误信息 res.status(403).json({ error: err.message }); } else { res.json({ message: "Post Created...", authData }) } }) })
方案2:修改代码从查询参数获取token(不推荐,存在安全风险)
如果坚持用查询参数传递,修改verifyToken函数:
function verifyToken(req, res, next) { // 从查询参数中获取token const bearerToken = req.query.authorisation; if (typeof bearerToken !== "undefined") { req.token = bearerToken; next(); } else { res.sendStatus(403); } }
注意:查询参数传递token可能被服务器日志记录,存在泄露风险,建议始终使用请求头传递。
额外优化建议
- 不要把密钥
secretkey硬编码在代码中,改用环境变量(如process.env.JWT_SECRET)管理。 - 为JWT设置过期时间,例如
jwt.sign({ user }, "secretkey", { expiresIn: '1h' }),提升认证安全性。
内容的提问来源于stack exchange,提问作者user3638078
相关产品推荐
相关产品推荐

