node.js - nodejs:重定向后 sessionID 正在更改。如何保持用户会话数据持久化?
问题描述
已经看到很多类似的问题,但无法弄清楚如何解决它。我有一个快速服务器,使用 cookie 会话。服务器正在调用 google auth api。
因为它是一个多用户的应用程序,所以我必须将谷歌身份验证信息与用户会话相关联
从谷歌取回这些身份验证数据后,我将它们保存在会话中。数据很好地保存在会话中。这里没有问题
但是重定向到另一个快速路由后,会话不同,因此无法访问保存的数据。
这是代码
谢谢
app.use(
session({
name: SESSION_NAME,
secret: SESSION_SECRET,
resave: false,
saveUninitialized: false,
cookie: {
maxAge: parseInt(SESSION_LIFETIME, 10), // 24H in config file
httpOnly: true,
sameSite: true,
secure: !IN_DEV
}
})
);
googleRouter.get("/oauthcallback", async (req, res) => {
try {
if (req.query.code && req.query.code !== "") {
const oauth2Client = initGoogleAuth();
const tokens = await getGoogleToken(oauth2Client, req.query.code);
if (tokens && tokens !== "") {
const s = await saveTokensInSession(req.session, tokens);
oauth2Client.setCredentials(tokens);
// save data in session
req.session.oauth2Client = oauth2Client;
req.session.save();
// oauth2Client is well saved here in session
console.log(req.session.oauth2Client);
//redirect to the next url
res.redirect("/googleauth/test");
} else res.send("error while getting tokens");
} else res.send("error while getting authorization code");
} catch (error) {
res.send(`error while getting token : ${error}`);
}
});
googleRouter.get("/test", async (req, res) => {
// oauth2Client is empty here and sessionID is different
console.log(req.session.oauth2Client);
});
解决方案
不久前我遇到了同样的问题。我只在从 save 方法得到回调后才继续解决它。看起来很傻,但它对我有用。
req.session.save((err) => {
if (err) {
return res.send("err while saving session information");
}
console.log(req.session.oauth2Client);
return res.redirect("/googleauth/test");
});
或者
return new Promise((resolve, reject) => {
req.session.save((err) => {
if (err) {
reject(err);
}
resolve(res.redirect("/googleauth/test"));
});
});
让我知道它是否适合你。
参考:https ://github.com/expressjs/session/issues/660
推荐阅读
- qt - 带有刻度线的 QSlider
- php - 未找到列:1054 'on 子句中的未知列 'locations.id'
- model-view-controller - 控制器或服务的责任?
- awk - 输出中间的换行符
- javascript - React esLint 错误:缺少数组中元素的“key”道具
- python - 高斯滤镜只会使图像变暗,不会模糊
- docker - 'stderr: remove /etc/passwd' 在构建 Docker 容器时
- reactjs - React intl 模板字符串抛出一个错过的 id 警告
- tfs - TFS 2018 和 AppCenter 测试
- yaml - Yaml : yaml 文件中的格式错误。预期的 '
',但发现'