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

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未传递,但这是基础配置要求)。

验证修复效果
  1. 重启后端服务
  2. 前端重新登录,通过浏览器开发者工具的「Application → Cookies」确认http://localhost:3500下存在token Cookie
  3. 点击“Check login.”按钮,此时/isLoggedIn请求会携带Cookie,服务端可正常获取Token并返回200状态

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 13:39:53