首页 > 解决方案 > 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);
});

标签: node.jsexpressredirectcookiesexpress-session

解决方案


不久前我遇到了同样的问题。我只在从 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


推荐阅读