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

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 winfrom的datagridview下拉框变成了黑色,渲染不成功
  • ¥15 FastReport.community,,“不需要在每行加条横线”,怎么让表格只在在页面底部有条横线
  • ¥20 利用ntfy实现短信推送
  • ¥30 如何用VBA代码写抽取TRIBON M3数据库的模型信息
  • ¥15 MySQL好难呀,怎么呀
  • ¥15 如何用Thonny写温湿度检测有源蜂鸣器报警并在oled屏上显示的代码?
  • ¥15 训练yolo时换了4060还不如之前1650,直接闪退,如何解决?
  • ¥15 锌合金的耐温能到多少度。可以持续多长时间
  • ¥15 .net调用本地office组件出现问题
  • ¥15 docker镜像拉取失败请教教我