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

为什么Express中携带Authorization头请求API仍返回403错误

问题根因及修复方案

核心错误1:请求头重复拼接Bearer前缀

前端传入的Authorization请求头本身已经符合Bearer <token>格式,但在api.js构造axios请求配置时,又额外拼接了一次Bearer 前缀,最终发送给下游接口的请求头变为Bearer Bearer <token>。下游服务校验token时取空格拆分后的第二位值为Bearer而非真实token,自然校验失败返回403。

核心错误2:变量名冲突覆盖Express响应对象

api.js中接口回调的入参已经命名为res(Express的响应对象),但axios请求的返回值也命名为res,后续调用res.writeHead、res.send实际操作的是axios返回的对象而非Express响应对象,会导致响应构造异常,甚至状态码返回错误。

次要错误:权限中间件响应写法不规范

token.js中res.sendStatus(403)会直接发送响应结束请求,后续的.send("A token is required for authentication")不会生效,还可能抛出响应重复发送的错误。


修复后的代码

token.js

module.exports = (req, res, next) => {
    const bearerHeader = req.headers['authorization'];
    console.log('verifyToken token=', bearerHeader)
    if (bearerHeader) {
        const bearer = bearerHeader.split(' ');
        const bearerToken = bearer[1];
        req.token = bearerToken;
        next();
      } else {
        // 修复响应写法
        res.status(403).send("A token is required for authentication");
      }
}

api.js

const verifyToken = require('../tools/token.js')

router.post('/metadata', verifyToken, async (req, res, next) => {
    console.log('api token =', req.headers['authorization'])
    // 修复1:避免重复拼接Bearer,两种写法二选一即可
    // 写法1:直接复用原有带前缀的请求头
    let config = { headers: { Authorization : req.headers['authorization'] }} 
    // 写法2:用中间件存储的token拼接,格式更规范
    // let config = { headers: { Authorization : 'Bearer ' + req.token }} 
    try {
        // 修复2:修改axios返回值变量名,避免覆盖Express的res
        const axiosRes = await axios.post(src + '/record/metadata', '', config)
        console.log('data=', axiosRes.data)
        res.writeHead(200);
        res.send(JSON.stringify(axiosRes.data))
    } catch(err){
        console.error(err)
        res.writeHead(401);
        res.end()
    }
})

补充说明

你单独测试下游接口返回200,是因为测试时传入的是正确格式的Bearer <token>请求头,通过当前封装的接口转发时头格式错误,才会触发403。

内容的提问来源于stack exchange,提问作者haha861924

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 19:57:00