NodeJS刷新页面时Cookie短暂消失导致JWT鉴权失败问题求助
问题修复方案
优先检查Express中间件的注册顺序,确保
cookie-parser注册在所有用到req.cookies的路由/鉴权中间件之前
该问题90%概率是中间件注册顺序错误导致:如果先挂载了带鉴权的业务路由,后注册cookie-parser,请求到达鉴权中间件时cookie还没被解析,req.cookies是空对象,自然找不到token。单页应用正常跳转走前端路由不会触发服务端请求,只有刷新时才会发起服务端请求刚好触发该问题,和你遇到的症状完全吻合。正确的注册顺序参考如下:const express = require('express') const cookieParser = require('cookie-parser') const app = express() // 先注册所有解析类中间件 app.use(express.json()) app.use(cookieParser()) app.use(session(/* 你的session配置 */)) // 再注册业务路由 app.use('/profile', verifyToken, /* 你的路由处理逻辑 */)修复鉴权中间件的错误处理逻辑
你当前的jwt.verify回调中,报错跳转后没有加return终止执行,会继续运行后续代码,大概率抛出decoded is undefined异常,修改后代码如下:const verifyToken = (req, res, next) => { const {cookies} = req; if ('token' in cookies) { jwt.verify(cookies.token, process.env.ACCESS_TOKEN_SECRET, (err, decoded) => { if (err) { console.log('COOKIE ERROR') return res.redirect('/../notLoggedIn'); } req.userId = decoded.user_id; next(); }); } else { console.log('NO VALID TOKEN') return res.redirect('/../notLoggedIn'); } }修复登录时Cookie配置的参数错误
res.cookie的maxAge参数只接收毫秒格式的相对有效期,你传入Date对象属于参数错误,应该换成接收Date对象作为绝对过期时间的expires参数,修改后代码如下:res.cookie('token', accessToken, { httpOnly: true, secret: process.env.SECRET, sameSite: true, expires: date });另外你同时使用
express-session和自定义JWT Token Cookie属于冗余配置,如果不需要用session存储其他数据,可以直接移除express-session的注册,避免多余的Cookie生成和解析开销。
内容的提问来源于stack exchange,提问作者Kevin. J
相关产品推荐
相关产品推荐

