express-session 不会通过跨站点请求保持会话

问题描述 投票:0回答:1

我的客户端/服务器架构:

  • 客户端(前端):Vue(Vite)
  • 服务器(后端):Express.js

目前我只使用

http
,因为它是一个开发环境。

为了安全处理请求,我在后端使用 corsexpress-session:

  • 登录并将有效的 user.id 添加到会话中
  • 请求受保护资源通过会话验证用户

同源请求有效(BE:localhost:3000通过Postman

passport Login:
1bxcYuh83nhWy7k7SZ8JX7Bb2j58MaUx <----------------------------- session.id
Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

passport protected resource:
1bxcYuh83nhWy7k7SZ8JX7Bb2j58MaUx <----------------------------- session.id
Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true },
  user: { id: '1q2w3e4r5t' }
}

但是使用不同的客户端,跨站点

GET
-请求失败(FE:localhost:5173<=>BE:localhost:3000)

passport Login:
Nk9GDYf8nypvpTa1kQCLdTS3WsOoCCt6 <----------------------------- session.id
Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

passport protected resource:
OruoNwKPX3lSg4JhtyjVg8qo_G3uJsvb <----------------------------- session.id
Session {
  cookie: { path: '/', _expires: null, originalMaxAge: null, httpOnly: true }
}

假设,原因是新的

session.id

前端的 fetch 方法设置选项

credential: "include"

由于当前会话中缺少

sessionUser
,请求在我的验证中间件处失败:

...
/**
 * AUTHENTICATION
 */
const isProtected:boolean = isProtectedResource(requiredResource);
const sessionUser:{[key:string]: string}|undefined = req.session?.user;

console.log('passport:')
console.log(req.session?.id)
...

// authenticate protected resources
if(isProtected && !sessionUser) {
    return res.status(401).send('Login needed! :-((');
} 
...

我的

express app
配置:

...
/**
 * SESSION
 * 
 * // SEE https://github.com/expressjs/session
 */
const session = require('express-session');
app.use(session({
  secret: 'api_1q2w3e4r5t',
  resave: false,
  //rolling: true,
  saveUninitialized: true,
  cookie: {
    //secure: true, // NOTE https
    sameSite: false,
    //maxAge: 1000 * 60 * 0 * 20
  }
}))

/**
 * CORS config
 */
import cors from "cors";
const corsOptions = {
  origin: "http://localhost:5173",
  methods: ['GET', 'PUT', 'POST', 'PATCH'],
  credentials: true,
};
app.use(cors(corsOptions));

问题:

  • 我的配置中缺少/错误什么才能使我的跨站点请求正常工作?
vue.js express cookies cors express-session
1个回答
0
投票

credentials
获取中缺少
Post
选项。

谢谢

© www.soinside.com 2019 - 2024. All rights reserved.