如何将登录路由获取的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对后续请求毫无意义。
正确实现步骤
- 修改中间件逻辑:从当前请求的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(); };
- 确保Express能解析Cookie:需要安装并使用
cookie-parser中间件,否则req.cookies会为空:
npm install cookie-parser
在Express主文件中配置:
const cookieParser = require('cookie-parser'); app.use(cookieParser());
- 调整登录端点逻辑:登录时只需确保Flask返回的HttpOnly Cookie被客户端正确保存即可,不需要在Express的登录请求里处理
res.locals.token——后续请求的Cookie会由客户端自动携带到Express。
这样,当客户端发起/Organizations请求时,会自动带上HttpOnly Cookie,中间件从Cookie中提取token并完成设置,控制器就能通过req.headers['Authorization']或者req.authToken拿到JWT了。
内容的提问来源于stack exchange,提问作者The_elevator
相关产品推荐
相关产品推荐

