我的客户端/服务器架构:
目前我只使用
http
,因为它是一个开发环境。
为了安全处理请求,我在后端使用 cors 和 express-session:
同源请求有效(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));
问题:
在
credentials
获取中缺少 Post
选项。
谢谢