sql >> Databasteknik >  >> NoSQL >> Redis

Implementerar jag serialisera och deserialisera NodesJS + Passport + RedisStore?

Om du använder sessioner du måste förse passet med en serialiserings- och deserialiseringsfunktion. Att implementera Redis som en sessionsbutik har ingenting att göra med hur pass implementerades, det handlar bara om var sessionsdata lagras.

Implementera sessioner med pass

Som jag sa måste serialisera och deserialisera funktionerna tillhandahållas i passet för att sessionerna ska fungera.

Syftet med serialiseringen Funktionen är att returnera tillräckligt med identifierande information för att återställa användarkontot vid eventuella efterföljande förfrågningar. Specifikt den andra parametern i done() metod är informationen serialiserad till sessionsdata .

avserialisera funktionen som du tillhandahåller är avsedd att returnera användarprofilen baserat på den identifierande informationen som serialiserades till sessionen .

Här är exemplet från Passport Guide i avsnittet som diskuterar sessioner:

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

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

I exemplet ovan passport.serializeUser() tillhandahålls en funktion som tar två parametrar, användarprofilen (user ) och en återuppringningsfunktion (done ). Återuppringningsfunktionen tar som sin andra parameter den identifierande informationen (user.id , men om du använder mongoDB kan detta vara user._id ) krävs för att återställa kontot från databasen. Detta kommer att anropas på varje autentiserad begäran och lagrar den identifierande informationen i sessionsdata (oavsett om det är i en cookie eller din Redis-butik).

passport.deserializeUser() tillhandahålls en funktion som också tar två parametrar, den identifierande informationen (id ) och igen en återuppringningsfunktion (done ). Identifieringsinformationen är vad som serialiserades till sessionsdata i den tidigare begäran (user.id ). Återuppringningsfunktionen här kräver användarprofilen som den andra parametern, eller något fel som uppstår vid hämtning av profilen som den första parametern. User.findById() funktion är en uppslagsfunktion för användarprofilen i databasen. I det här exemplet User objekt är en instans av en mangustmodell som har findById() funktion.

Funktionen som tillhandahålls till passport.deserializeUser() anropas av passets mellanprogram, passport.session() före rutthanteringen för att lagra användarprofilen (user ) till req.user .

Implementera Redis som en sessionsbutik

Syftet med att använda Redis är att lagra sessionsdataserversidan så att den enda data som lagras på klientsidan är sessions-id. Återigen, detta är oberoende av hur du har implementerat pass, pass bryr sig inte om var sessionsdata lagras så länge du har lagt till sessionsstöd till din app. Den här föregående frågan om stackoverflow tar upp hur man implementerar Redis



  1. Använda Redis Sets

  2. Hur man väljer det bästa MongoDB-hotellet för ditt företag

  3. MongoDB $replaceOne

  4. MongoDB $subtrahera