Redis
 sql >> Database >  >> NoSQL >> Redis

Implementare serializzare e deserializzare NodesJS + Passport + RedisStore?

Se stai utilizzando sessioni devi fornire il passaporto con una funzione di serializzazione e deserializzazione. L'implementazione di Redis come archivio di sessioni non ha nulla a che fare con il modo in cui è stato implementato il passaporto, si occupa solo di dove sono archiviati i dati della sessione.

Sessioni di attuazione con passaporto

Come ho detto, le funzioni di serializzazione e deserializzazione devono essere fornite al passaporto affinché le sessioni funzionino.

Lo scopo della serializzare la funzione è quella di restituire informazioni identificative sufficienti per recuperare l'account utente su eventuali richieste successive. In particolare il secondo parametro del done() metodo è l'informazione serializzata nei dati della sessione .

La deserializzazione la funzione che fornisci ha lo scopo di restituire il profilo utente in base alle informazioni di identificazione che sono state serializzate nella sessione .

Ecco l'esempio tratto dalla Passport Guide nella sezione dedicata alle sessioni:

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

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

Nell'esempio sopra passport.serializeUser() viene fornita una funzione che accetta due parametri, il profilo utente (user ) e una funzione di callback (done ). La funzione di callback prende come secondo parametro le informazioni di identificazione (user.id , ma se stai usando mongoDB questo potrebbe essere user._id ) necessario per recuperare l'account dal database. Questo verrà chiamato ad ogni richiesta autenticata e memorizza le informazioni identificative nei dati della sessione (sia che si trovino in un cookie o nel tuo negozio Redis).

passport.deserializeUser() viene fornita una funzione che accetta anche due parametri, le informazioni identificative (id ) e ancora una funzione di callback (done ). Le informazioni di identificazione sono ciò che è stato serializzato nei dati della sessione nella richiesta precedente (user.id ). La funzione di callback qui richiede il profilo utente come secondo parametro o qualsiasi errore sollevato nel recupero del profilo come primo parametro. Il User.findById() function è una funzione di ricerca per il profilo utente nel database. In questo esempio User object è un'istanza di un modello mangusta che ha il findById() funzione.

La funzione fornita a passport.deserializeUser() viene chiamato dal middleware del passaporto, passport.session() prima della gestione del percorso per memorizzare il profilo utente (user ) a req.user .

Implementazione di Redis come Session Store

Lo scopo dell'utilizzo di Redis è archiviare i dati della sessione lato server in modo che gli unici dati archiviati lato client siano l'ID sessione. Ancora una volta, questo è indipendente da come hai implementato il passaporto, il passaporto non si preoccupa di dove vengono archiviati i dati della sessione finché hai aggiunto il supporto della sessione alla tua app. Questa domanda precedente su StackOverflow riguarda come implementare Redis