Express.js登录后JWT Token无法识别的问题求助
在Express.js项目中实现基于JWT和Cookie的用户登录验证功能:输入正确用户名密码登录后,前端控制台显示“Successful login.”,但点击“Check login.”按钮调用/isLoggedIn接口时,前端返回401未授权,页面显示“Not logged in.”,服务端控制台输出“No token.”,触发authUser中间件无Token的401逻辑。
1. 登录请求未携带跨域凭证
前端使用axios发送登录请求时,未配置withCredentials: true,导致服务器设置的Cookie无法被浏览器保存,后续请求自然无法携带Cookie。
修改App.jsx中的handleSubmit函数:
const handleSubmit = async (e) => { e.preventDefault(); try { const response = await axios.post( "http://localhost:3500/user/login", formData, { withCredentials: true } // 新增跨域凭证配置 ); console.log(response.data); } catch (error) { console.error("Login error:", error); } };
2. 重复的CORS配置导致凭证失效
index.js中重复调用两次app.use(cors()),第二次配置会干扰第一次的CORS规则,可能导致跨域凭证(Cookie)无法正常传递。
修改index.js,删除重复的CORS配置:
保留第一个CORS配置,删除第二个冗余的app.use(cors(...)),调整中间件顺序为:CORS → cookieParser → 请求体解析 → 路由:
// 保留唯一的CORS配置 app.use( cors({ origin: function (origin, callback) { if (!origin || allowedOrigins.includes(origin)) { callback(null, true); } else { callback(new Error("Not allowed by CORS")); } }, credentials: true, methods: ["GET", "POST", "PUT", "DELETE"], allowedHeaders: ["Content-Type"], }) ); // 中间件执行顺序按此排列 app.use(cookieParser()); app.use(express.urlencoded({ extended: false })); app.use(express.json()); app.use("/user", require("./routes/userRouter"));
3. Cookie的SameSite属性配置缺失
设置Cookie时未指定SameSite属性,默认值Lax在跨域场景(前端5173、后端3500)下可能导致浏览器不发送Cookie到服务器。
修改userRouter.js中的登录接口Cookie配置:
本地HTTP开发环境使用sameSite: 'Lax';HTTPS环境需设置sameSite: 'None'并启用secure: true:
res.cookie("token", token, { httpOnly: true, sameSite: 'Lax', // 本地HTTP环境用Lax;HTTPS环境改为'None' // secure: true, // HTTPS环境需启用此配置 });
4. 验证JWT密钥环境变量
确保.env文件中存在ACCESS_TOKEN字段,且值为有效字符串,避免后续Token验证环节出现问题(当前问题为Token未传递,但这是基础配置要求)。
- 重启后端服务
- 前端重新登录,通过浏览器开发者工具的「Application → Cookies」确认
http://localhost:3500下存在tokenCookie - 点击“Check login.”按钮,此时
/isLoggedIn请求会携带Cookie,服务端可正常获取Token并返回200状态
内容的提问来源于stack exchange,提问作者Carasidelt

