passport.js 多个反/序列化方法

Die*_*ero 0 node.js express passport.js

我正在构建一个由两部分组成的登录系统。如果用户将登录到主帐户Account模型,该帐户将拥有对多个团队Team模型的访问权限,并且每个团队User模型一个帐户可以有 1 个用户。问题是我可以Account使用护照定义登录策略,但我只能使用Account模型进行序列化和反序列化,但是当我想Account使用User与 a 相关的特定数据重定向或登录时,Team我无法使用护照记录它们。我需要一些想法或解决方案,也许我可以使用一些护照策略。PS:把这想象成一个slack登录系统的作品,主帐户(电子邮件)可以容纳多个团队或聊天组,每个都有特定的细节。

ves*_*sse 5

如果我正确理解您的需求,我相信您有两个选择 - 注册多个(反)序列化器,或者将更多逻辑放入您的(反)序列化实现中。

虽然没有真正记录,但您可以注册多个序列化序列化函数。如果第一个函数不成功,它应该调用done('pass');让执行继续到下一个(反)序列化器,例如。(请注意,代码示例就在我的脑海中):

passport.deserializeUser((obj, done) => {
  Account.deserialize(obj)
    .then((account) => done(null, account))
    .catch((err) => done('pass'));
});

passport.deserializeUser((obj, done) => {
  User.deserialize(obj).then((user) => done(null, user))
});
Run Code Online (Sandbox Code Playgroud)

您不仅限于使用您选择的 ORM/ODM 的明显内置(反)序列化。因此,您可以在序列化函数中执行您需要的任何自定义逻辑。比如在序列化时将模型实例ID和类型放入一个对象中,反序列化时使用。

passport.serializeUser((obj, done) => {
  if (obj instanceof Account) {
    done(null, { id: obj.id, type: 'Account' });
  } else {
    done(null, { id: obj.id, type: 'User' });
  }
});

passport.deserializeUser((obj, done) => {
  if (obj.type === 'Account') {
    Account.get(obj.id).then((account) => done(null, account));
  } else {
    User.get(obj.id).then((user) => done(null, user));
  }
});
Run Code Online (Sandbox Code Playgroud)