Firestore + Passport.js функциональность сессии - PullRequest
0 голосов
/ 15 мая 2018

Я использую Passport.js (локальный) с Firestore для создания серверной части сайта. Все работает нормально, пока не пришло время заняться управлением сессиями. Документ Passport.js Похоже, что сериализация и десериализация сеанса должны использоваться вместе с MongoDB. Нет никаких инструкций относительно того, как реализовать это на других БД NoSQL. Я пытался реализовать себя, что привело меня сюда.

Проблема в том, что каждый запрос, возвращаемый Firestore, имеет форму обещания, и я никак не могу получить доступ к результату вне класса .then() и поэтому не могу их сериализовать и десериализовать для создания сеансов. идентификатор для отдельных пользователей. Кроме того, для меня просто невозможно просто позвонить user.id, чтобы получить идентификатор документа из Firestore (но это совершенно нормально с 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);
        }
      });
  });

Функциональный (рабочий) вывод с использованием MongoDB при ведении журнала консоли req.session:

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, и я собирался использовать его возможности для работы с базами данных; следовательно, из-за незнания кодовая база была уже сделана на 75%, когда я понял, что Goggle также предоставил функцию аутентификации специально для Firestore.

...