518651 2023-10-30 20:34 采纳率: 40%
浏览 2
已结题

Next.JS 实现 Auth 传递Session对象时属性丢失

问题简述:Next.JS 实现 Auth 传递Session对象时属性丢失
开发环境:Next.JS + iron-session
完整描述:createSessionRoute函数中第三方登录函数authenticateEmail完成用户登录返回的Session信息使用iron-session库存储在req.session.session位置,如下图

img

再保护路由的函数中获取存储的Session时,发现丢失部分属性

img


红圈位置为丢失的属性

img

解决问题:让checkSessionHandler函数获取的Session对象与authenticateEmail返回的Session是同一个

irson-session 配置代码:

img

处理登录逻辑并保存Session信息代码

img

获取上面保存的Session

img

  • 写回答

4条回答 默认 最新

  • 社区专家-Monster-XH 2023-10-30 20:49
    关注
    • 用 iron-session 时某些属性在反序列化的时候被丢失了。这个问题可能是由于 JavaScript 的函数或者方法不能被直接序列化和反序列化导致的。

    • 当你把 session 保存到 req.session.session 的时候, iron-session 会对其进行序列化操作。但是 Session 类中的方法,如 update 和其他的方法,在序列化的过程中会被忽略。

    • 为了解决这个问题,你可以:

    • 只保存 Session 对象的数据部分到 req.session.session,而不是整个对象。

    • 当你需要用到 Session 类的方法时,从数据重新创建一个新的 Session 对象。

    改进

    // 在登录成功后
    client.authenticateEmail(email, password, false, email).then(async (session) => {
      // 只保存数据部分,而不是整个对象
      req.session.sessionData = {
        token: session.token,
        refreshToken: session.refreshToken,
        created: session.created,
        // ... 其他需要的属性
      };
      await req.session.save();
      res.send({ ok: true });
    });
    
    // 在读取 Session 时
    var sessionData = req.session.sessionData;
    if (sessionData) {
      // 从数据重新创建 Session 对象
      var restoredSession = new Session(sessionData.token, sessionData.refreshToken, sessionData.created);
      // 这时 restoredSession 就会有它的所有方法了
      res.send(restoredSession);
    }
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 11月7日
  • 已采纳回答 10月30日
  • 创建了问题 10月30日

悬赏问题

  • ¥15 救!ENVI5.6深度学习初始化模型报错怎么办?
  • ¥30 eclipse开启服务后,网页无法打开
  • ¥30 雷达辐射源信号参考模型
  • ¥15 html+css+js如何实现这样子的效果?
  • ¥15 STM32单片机自主设计
  • ¥15 如何在node.js中或者java中给wav格式的音频编码成sil格式呢
  • ¥15 不小心不正规的开发公司导致不给我们y码,
  • ¥15 我的代码无法在vc++中运行呀,错误很多
  • ¥50 求一个win系统下运行的可自动抓取arm64架构deb安装包和其依赖包的软件。
  • ¥60 fail to initialize keyboard hotkeys through kernel.0000000000