Firestore + Passport.js会话功能

时间:2018-05-15 15:48:57

标签: node.js firebase passport.js google-cloud-firestore passport-local

我正在使用Passport.js(本地)和Firestore来创建网站的后端。一切正常,直到没有时间进行一些会话管理。 Passport.js文档。似乎建议会话序列化和反序列化与MongoDB一起使用。没有关于如何在其他NoSQL DB上实现它的任何说明。我确实试图实现自己,这引导我来到这里。

问题是Firestore返回的每个查询都是一个promise的形式,我无法访问.then()类之外的结果,因此无法对它们进行序列化和反序列化,以便为各个用户创建会话ID。此外,我只是不可能只是通过调用user.id来获取Firestore中文档的ID(但对于MongoDB来说它完全没问题)。

无论如何,我可以让Passport.js的会话功能与Firestore一起使用吗?

非常感谢任何帮助。

有关完整长度的代码,请参阅hastebin

官方文件是什么。表明:

passport.serializeUser(function(user, done) {
  done(null, user.id);
});

passport.deserializeUser(function(id, done) {
  User.findById(id, function(err, user) {
    done(err, user);
  });
}); 

我面临的情况:

 passport.serializeUser(function(doc, done) {
    done(null, doc.id);
  });
  passport.deserializeUser(function(doc_id, done) {
    DBReg.doc(doc_id)
      .get()
      .then(doc => {
        if (!doc.exists) {
          console.log('Nope');
        } else {
          done(err, doc.data().name);
        }
      });
  });

通过控制台记录req.session使用MongoDB进行功能(工作)输出:

Session {
  cookie:
   { path: '/',
     _expires: null,
     originalMaxAge: null,
     httpOnly: true },
  flash: {},
  passport: { user: '5afa5ded957b8187e111f966' } }
  

请注意以passport:

开头的最后一行

我正在使用Firestore的输出:

 Session {
      cookie:
       { path: '/',
         _expires: null,
         originalMaxAge: null,
         httpOnly: true },
      flash: {},
  

现在passport:已经消失

不要问我为什么我没有使用Firestore提供的内置身份验证功能。这是我第一次使用Firestore,我正在寻找它的数据库功能;因此,由于无知,当我意识到Goggle还专门为Firestore提供了一个auth功能时,代码库已经完成了75%。

1 个答案:

答案 0 :(得分:0)

我们发现express.js将会话存储在内存中。为了使会话持续存在,最好检查一下mongo-connect或redis-connect。