当前位置: 首页 > 知识库问答 >
问题:

Passportjs的会话问题

江永安
2023-03-14
this.app.use(session({
  secret: process.env.SESSION_SECRET || configuration.session_secret,
  store: new fileStore(),
  resave: false,
  saveUninitialized: false
}));

// config authentication
this.app.use(passport.initialize());
this.app.use(passport.session());
// Configure Passport
passport.use('local-login', new localStrategy.Strategy(
    (username, password, done) => {
      Services.users.authenticatePromise(username, password).then(
          function(token) {
            done(null, token);
          },
          function(err) {
            done(null, false, err);
          },
      ).done();
    },
));
    // Serialize user in session
passport.serializeUser((token: AccessToken, done) => {
  let user = {
    _token: token.accessToken,
    _expiryInAt: token.expiryInMs + new Date().getTime(),
  };
  done(null, user);
});

passport.deserializeUser((sessionUser, done) => {
  done(null, sessionUser);
});

我错过了什么?

共有1个答案

吕翰飞
2023-03-14

我可以看到你的代码有几个错误。

首先,SerializeUser应该接受一个对象并返回一个字符串(通常是唯一的id或数据库键)。您的函数当前接受一个字符串并返回一个对象;那是倒过来的。

其次,DeserializeUser应该接受一个字符串并返回一个user对象。您的函数当前接受一个对象并返回相同的对象。

最后,SerializeUserDeserializeUser必须是彼此相反的;这意味着,passport可以调用DeserializeUser(serializeUser(user))并取回原始用户对象。

所以你会想要这样的东西:

passport.serializeUser((user, done) => {
  return user.id;
});

passport.deserializeUser((id, done) => {
  getUserFromDatabase({id: id}, function(err, user) {
    if (err) {
      done(err, null); // something went wrong; return error
    } else if (!user) {
      done(null, false); // no user found; return `false`
    } else {
      done(null, user);  // return user
    }
  });
});
 类似资料:
  • 我正在使用codeigniter。我有个奇怪的问题。我在用户登录时设置会话,并将其重定向到新页面。我观察到,会话有时设置,有时不设置。我尝试过使用codeigniter会话 以下是配置文件的外观:

  • 我在Chrome上使用数据库的codeigniter会话有一个严重的问题:当我使用Chrome开发者工具刷新页面时,会话被破坏。 这是我的会话配置: 你知道吗?

  • 我正在Codeigniter中创建API。在这个API中,我为用户提供了一个登录函数。如果登录成功,我将在CI会话中设置用户数据,并将会话返回给用户。 现在,用户可以使用该会话ID来验证他自己的所有其他请求,如添加/更新/删除。基本上,我希望当用户发送下一个请求时,我可以根据他的会话ID验证他的凭据。 客户请求代码: 上面是一个从客户端到服务器的登录请求示例。在服务器端,服务器验证客户端提供的凭据

  • 问题内容: 我在会话方面遇到问题,有时我 刚刚 设置的会话变量在下一页请求中未定义。为了正确设置变量,我通常必须再次执行该流程。 我可以确认我没有尝试将会话变量设置为undefined。他们有合法的价值。 在我的应用中,用户从/ twitter / connect /移至/ twitter / callback /。前者从Twitter检索一些oauth数据,后者将用户登录到Twitter。 /

  • 我正在尝试使用Spring和DBunit测试我的代码(http://springtestdbunit.github.io/) 一旦进入单元测试: 将返回DBUnit插入的实体列表,因此它确实在数据库(MYSQL)中插入了记录。 但是: 将返回false!它无法使用无状态会话找到任何记录。 之前,我使用Liquibase插入相同的记录,这段代码工作得很好。 使用HSql更糟糕的是,它在尝试打开无状态

  • 问题内容: 下面的函数是我在Web应用程序中具有的按钮的actionListener,我正在从数据库中的表中删除旧选择的行,并将新行插入数据库中。 我一直在例外:会话关闭!有人可以解释一下如何在hibernate状态下关闭会话(自动吗?)以及如何使用它们。 这是该异常的详细堆栈跟踪: 谢谢, 问题答案: 在Hibernate会话显然配置为基于请求的情况下,您在会话范围内的受管Bean中使用了延迟获