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

如何将登录路由获取的JWT传递至Express后续请求?

问题说明

我从Flask服务器向Express发送HttpOnly JWT Cookie,用Postman测试带JWT认证的请求能正常工作,所以后端逻辑本身没问题。但在Express里遇到了JWT传递的问题:

/login端点代码

router.post('/login', (req, res, next) => {
 axios.post(`...../login`, {
  email: req.body.email, 
  password: req.body.password
 }, { headers: {
 ........
const token = access_token_cookie.substring(jwt_start, jwt_end);
res.locals.token = token;
next()
return res.json({
  success: response.data.success,
   .......
})
  }).catch( (err)  => {return res.status(400).json({
    success: false,
   message: 'Could not process the form.'
})})
},addAuthTokenToHeaderMiddleware);

module.exports = router;

addAuthTokenToHeaderMiddleware中间件代码

const addAuthTokenToHeaderMiddleware = (req, res, next) => {
  if (res.locals && res.locals.token) {
    req.headers['Authorization'] = `Bearer ${res.locals.token}`;
  }
  console.log('req.headers :', req.headers['Authorization'])
  next();
};

module.exports = addAuthTokenToHeaderMiddleware;

问题现象

登录时,中间件里的console.log能正常打印出JWT,但把这个中间件用在后续的/Organizations请求时:

router.route('/Organizations').post(addAuthTokenToHeaderMiddleware,asyncMiddleware(allControllers.Organizations))

console.log显示undefined,我需要在Organizations控制器里用到这个JWT:

exports.Organizations = async (req, res, next) => {.....}

问题原因及解决方法

核心原因

res.locals是单次请求生命周期内的临时存储,登录请求结束后,res.locals里的内容就会被销毁。后续的/Organizations请求是全新的独立请求,自然拿不到之前存在res.locals里的token。

而且你的思路逻辑有误:中间件的作用应该是从当前请求中提取JWT(比如从HttpOnly Cookie里),再放到req.headers或者req对象上供后续控制器使用,而不是在登录请求里往req.headers塞token——登录请求的req.headers对后续请求毫无意义。

正确实现步骤

  1. 修改中间件逻辑:从当前请求的Cookie中提取JWT,再设置到请求头或者直接挂载到req对象上:
const addAuthTokenToHeaderMiddleware = (req, res, next) => {
  // 替换成你实际的HttpOnly Cookie键名
  const accessTokenCookie = req.cookies['access_token']; 
  if (accessTokenCookie) {
    // 如需放到Authorization头里
    req.headers['Authorization'] = `Bearer ${accessTokenCookie}`;
    // 也可以直接挂载到req上,更便于控制器调用
    req.authToken = accessTokenCookie;
  }
  console.log('req.headers.Authorization:', req.headers['Authorization']);
  next();
};
  1. 确保Express能解析Cookie:需要安装并使用cookie-parser中间件,否则req.cookies会为空:
npm install cookie-parser

在Express主文件中配置:

const cookieParser = require('cookie-parser');
app.use(cookieParser());
  1. 调整登录端点逻辑:登录时只需确保Flask返回的HttpOnly Cookie被客户端正确保存即可,不需要在Express的登录请求里处理res.locals.token——后续请求的Cookie会由客户端自动携带到Express。

这样,当客户端发起/Organizations请求时,会自动带上HttpOnly Cookie,中间件从Cookie中提取token并完成设置,控制器就能通过req.headers['Authorization']或者req.authToken拿到JWT了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:28:30