You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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安全规范)

  1. 在Postman的Headers标签中添加:
    • 键:Authorization
    • 值:Bearer 你的token内容(注意Bearer和token之间有空格)
  2. 修正重复响应的问题,修改/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 23:15:48