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