Ако използвате сесии трябва да предоставите паспорт с функция за сериализиране и десериализиране. Внедряването на Redis като хранилище за сесии няма нищо общо с това как е бил внедрен паспортът, а се занимава само с това къде се съхраняват данните за сесията.
Внедряване на сесии с паспорт
Както казах, функциите за сериализиране и десериализиране трябва да бъдат предоставени на паспорта, за да работят сесиите.
Целта на сериализиране функцията е връщане на достатъчно идентифицираща информация за възстановяване на потребителския акаунт при всякакви последващи заявки. По-конкретно вторият параметър на done()
метод е информацията, сериализирана в данните за сесия .
Вдесериализирането функцията, която предоставяте, има за цел връщане на потребителския профил въз основа на идентифициращата информация, която е била сериализирана в сесията .
Ето примера от Ръководството за паспорти в раздела, обсъждащ сесиите:
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()
е предоставена функция, която приема два параметъра, потребителския профил (user
) и функция за обратно извикване (done
). ). Функцията за обратно извикване приема като втори параметър идентификационната информация (user.id
, но ако използвате mongoDB това може да е user._id
), необходими за възстановяване на акаунта от базата данни. Това ще се извиква при всяка удостоверена заявка и съхранява идентифициращата информация в данните за сесията (независимо дали е в бисквитка или в магазина на Redis).
passport.deserializeUser()
е предоставена функция, която също приема два параметъра, идентифициращата информация (id
) и отново функция за обратно извикване (done
). ). Идентификационната информация е това, което беше сериализирано към данните за сесията в предишната заявка (user.id
). Функцията за обратно извикване тук изисква потребителския профил като втори параметър или всяка грешка при извличането на профила като първи параметър. User.findById()
функцията е функция за търсене на потребителския профил в базата данни. В този пример User
обектът е екземпляр на модел мангуста, който има findById()
функция.
Функцията, предоставена на passport.deserializeUser()
се извиква от междинния софтуер на паспорта, passport.session()
преди обработката на маршрута за съхраняване на потребителския профил (user
) към req.user
.
Внедряване на Redis като магазин за сесии
Целта на използването на Redis е да се съхранява от страна на сървъра за данни на сесията, така че единствените съхранявани данни от страна на клиента е идентификаторът на сесията. Отново, това е независимо от начина, по който сте внедрили паспорт, паспортът не се интересува къде се съхраняват данните за сесията, стига да сте добавили поддръжка за сесия към приложението си. Този предходен въпрос за stackoverflow адресира как да внедрите Redis