Node.js使用passport-local登录Postman正常,Vue前端请求报未登录错误
问题根因
Postman不存在浏览器跨域限制,会自动携带服务端种下的session cookie,而Vue前端是跨域场景,出现该问题100%是session cookie没有被浏览器正确存储/携带导致的,按以下顺序排查即可:
排查步骤
- 检查登录接口的axios配置是否加了
withCredentials: true
绝大多数用户只会给业务接口加该配置,忽略了登录请求必须也要携带该配置,否则服务端返回的set-cookie响应头会被浏览器忽略,根本不会存储session id。
登录请求示例:// 登录请求必须加withCredentials await axios.post('http://localhost:3000/login', formData, { withCredentials: true }) - 核对后端CORS配置是否符合要求
跨域带cookie场景下,CORS的origin不能配置为通配符*,必须和前端实际访问地址完全匹配,示例(express cors中间件):const cors = require('cors') app.use(cors({ // 必须写前端完整地址,比如Vue本地运行是http://localhost:5173就填这个,不能填* origin: 'http://localhost:5173', credentials: true })) - 修正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 } })) - 验证域名一致性
前后端访问的域名必须完全一致,比如不要后端接口用127.0.0.1,前端页面用localhost访问,二者会被判定为不同源,cookie无法互通。
验证方法
打开浏览器调试工具的「应用/Application」面板,查看Cookie列表中是否存在服务端种下的connect.sid(express-session默认的cookie名),再查看/jobs接口的请求头,确认是否携带了Cookie字段。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

