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

Node.js使用passport-local登录Postman正常,Vue前端请求报未登录错误

问题根因

Postman不存在浏览器跨域限制,会自动携带服务端种下的session cookie,而Vue前端是跨域场景,出现该问题100%是session cookie没有被浏览器正确存储/携带导致的,按以下顺序排查即可:

排查步骤

  1. 检查登录接口的axios配置是否加了withCredentials: true
    绝大多数用户只会给业务接口加该配置,忽略了登录请求必须也要携带该配置,否则服务端返回的set-cookie响应头会被浏览器忽略,根本不会存储session id。
    登录请求示例:
    // 登录请求必须加withCredentials
    await axios.post('http://localhost:3000/login', formData, {
      withCredentials: true
    })
    
  2. 核对后端CORS配置是否符合要求
    跨域带cookie场景下,CORS的origin不能配置为通配符*,必须和前端实际访问地址完全匹配,示例(express cors中间件):
    const cors = require('cors')
    app.use(cors({
      // 必须写前端完整地址,比如Vue本地运行是http://localhost:5173就填这个,不能填*
      origin: 'http://localhost:5173',
      credentials: true
    }))
    
  3. 修正express-session的cookie配置
    passport-local依赖express-session存储登录态,开发环境(http协议)下不要配置sameSite: 'none'和secure: true,否则浏览器会拒绝存储cookie,正确配置示例:
    app.use(session({
      secret: '你的自定义加密密钥',
      resave: false,
      saveUninitialized: false,
      cookie: {
        maxAge: 1000 * 60 * 60 * 24, // 1天有效期
        sameSite: 'lax', // 本地开发用lax或strict即可,生产https环境可以按需改none
        secure: false // 本地http环境必须为false,生产https环境再改为true
      }
    }))
    
  4. 验证域名一致性
    前后端访问的域名必须完全一致,比如不要后端接口用127.0.0.1,前端页面用localhost访问,二者会被判定为不同源,cookie无法互通。

验证方法

打开浏览器调试工具的「应用/Application」面板,查看Cookie列表中是否存在服务端种下的connect.sid(express-session默认的cookie名),再查看/jobs接口的请求头,确认是否携带了Cookie字段。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 12:15:03