Dois-je mettre en œuvre sérialiser et désérialiser NodesJS + Passeport + RedisStore?
Dois-je mettre en œuvre Sérialiser et Désérialiser?
RedisStore est la configuration que ma session magasin avec Express. Est-ce à dire que je NE PAS mettre en œuvre Sérialiser et Désérialiser? Il va se faire automatiquement?
Quand je ne pas mettre en œuvre ces méthodes, je reçois la demande explicite de l'erreur 500 Erreur: impossible de sérialiser l'utilisateur dans la session. Quand je fais les mettre en œuvre, je ne suis pas sûr que mettre dans le Désérialiser.
Le code ci-dessous s'affiche à travailler, mais les séances ne sont pas persistantes. J'ai besoin de vous connecter à chaque fois que je visite le site.
Est-il un bon exemple de NodeJS + Passeport + RedisStore?
var sessionStore = new RedisStore({
host: rtg.hostname,
port: rtg.port,
db: redisAuth[0],
pass: redisAuth[1]
});
passport.use(new ForceDotComStrategy({
clientID: clientId,
clientSecret: clientSecret,
callbackURL: myurl
},
function(token, tokenSecret, profile, done) {
console.log(profile);
return done(null, profile);
}
));
appSecure.configure('production', function(){
appSecure.use(allowCrossDomain);
appSecure.use(express.cookieParser(expressSecret));
appSecure.use(express.bodyParser());
appSecure.use(express.methodOverride());
appSecure.set('port', port);
appSecure.use(express.session({ secret: expressSecret, store: sessionStore, key:'expressSid', cookie: { maxAge : 604800, domain:'.domain.com'}}));
appSecure.use(passport.initialize());
appSecure.use(passport.session());
appSecure.use(appSecure.router);
appSecure.use(express.static(__dirname + '/public'));
appSecure.use(express.errorHandler());
});
passport.serializeUser(function( user, done ) {
done( null, user.id);
});
passport.deserializeUser(function( user, done ) {
done( null, user );
});
Vous devez vous connecter pour publier un commentaire.
Si vous utilisez sessions vous devez fournir un passeport avec une sérialiser et désérialiser fonction. La mise en œuvre de Redis une session magasin n'a rien à voir avec la façon dont le passeport a été mise en œuvre, il ne traite qu'avec les où les données de session sont stockées.
La mise en œuvre de Séances avec passeport
Comme je l'ai dit, le sérialiser et désérialiser les fonctions doivent être fournis à passeport pour les sessions de travail.
Le but de la sérialiser la fonction est de retour de suffisamment d'informations d'identification pour récupérer le compte d'utilisateur sur toutes les requêtes suivantes. Plus précisément, le deuxième paramètre de la
done()
méthode de l'information est sérialisé dans la session de données.La désérialiser de la fonction que vous fournissez sont destinées à retour le profil de l'utilisateur basée sur les informations d'identification qui a été sérialisé à la session.
Voici l'exemple de la Passeport Guide dans la section sur les sessions:
Dans l'exemple ci-dessus
passport.serializeUser()
est pourvu d'une fonction qui prend deux paramètres, le profil de l'utilisateur (user
) et une fonction de rappel (done
). La fonction de rappel prend comme deuxième paramètre l'identifiant de l'information (user.id
, mais si vous êtes en utilisant mongoDB cela peut êtreuser._id
) nécessaire pour récupérer le compte à partir de la base de données. Ce sera appelée à chaque demande authentifiée et stocke les informations d'identification dans les données de session (si c'est dans un cookie ou votre Redis magasin).passport.deserializeUser()
est fourni une fonction qui prend deux paramètres, les informations d'identification (id
) et de nouveau une fonction de rappel (done
). L'information d'identification est ce qui a été sérialisé à la session de données dans la demande précédente (user.id
). La fonction de rappel ici nécessite le profil de l'utilisateur comme deuxième paramètre, ou de toute erreur dans soulevées dans l'extraction du profil en tant que premier paramètre. LeUser.findById()
fonction est une fonction de recherche pour le profil de l'utilisateur dans la base de données. Dans cet exempleUser
objet est une instance d'une mangouste modèle qui a lefindById()
fonction.La fonction fournie à
passport.deserializeUser()
est appelé par le passeport middleware,passport.session()
avant la route de la manipulation pour stocker le profil de l'utilisateur (user
) àreq.user
.La mise en œuvre de Redis une Session Magasin
Le but de l'utilisation de Redis est de stocker les données de session côté serveur donc les seules données stockées côté client est l'id de session. Encore une fois, ceci est indépendant de la façon dont vous avez mis en œuvre le passeport, le passeport n'est pas de l'endroit où les données de session sont stockées aussi longtemps que vous avez ajouté session de prise en charge de votre application. Cette previos question sur stackoverflow porte sur la façon de mettre en œuvre Redis
Peu en retard, mais j'ai fait ce visuel chose à comprendre
passport.authenticate()
appelle respectifs de la stratégie que vous fournissez comme argument, il vous matchreq.body.password
etreq.body.username
avec la base de données stockée en mémoire des mots de passe et nom d'utilisateur. si l'utilisateur trouve que vous avez passer àdone()
comme deuxième argument d'autre vousreturn false
Le fait de rappel, de retour à
passport.authenticate()
. si le fait est appelé précédemment avec l'utilisateur (c'est à diredone(null,user);
) quereq,logIn()
est appelé automatiquement ou par l'utilisateur derrière la scènereq.logIn()
appelspassport.serializeUser()
la clé de l'utilisateur de l'objet que vous fournissez dans le deuxième argument de la fait en fonction serialize est enregistré dans la session et est utilisé pour récupérer l'intégralité de l'objet via désérialiser fonction.
Fonction Serialize de déterminer quelles sont les données de l'utilisateur de l'objet doit être stocké dans la session. Le résultat de la serializeUser méthode est attaché à la session en tant qu'
req.session.passport.user = {}
ici par exemple, il serait(comme nous fournir l'id comme clé)req.session.passport.user = {id:'xyz'}
Dans désérialiser fonction que vous fournissez dans le premier argument de désérialiser fonction de cette même clé de l'utilisateur de l'objet qui a été donné à fait fonction serialize appel. donc, l'ensemble de votre objet est récupéré avec l'aide de la touche. cette clé ici est id(clé peut être n'importe quelle touche de l'utilisateur de l'objet nom de l'ie,courriel, etc.)
Dans désérialiser fonction que la touche est en correspondance avec la mémoire de la matrice de base de données /ou des données de ressources
Extraites de l'objet est joint à la demande de l'objet comme
req.user
id
clé peut être n'importe quelle touche de l'utilisateur de l'objet iename,email
etcFlux Visuel
ici
id
clé peut être n'importe quelle touche de l'utilisateur de l'objet iename,email
etcCompte tenu de la configuration suivante de
express-session
avecconnect-redis
que la session magasin (à l'aide de Express 4):Vous pouvez juste dire passeport pour sérialiser l'ensemble de l'objet utilisateur, au lieu de simplement l'id de l'utilisateur.
L'ensemble de l'objet utilisateur sera enregistré avec la session dans le Redis, et placé sur la demande que
req.user
pour chaque demande.