Passport.js - Erreur: impossible de sérialiser l'utilisateur dans la session
J'ai eu un problème avec l'Passport.js module et Express.js.
C'est mon code et je veux juste utiliser un standard de connexion pour le premier essai.
Je reçois toujours le message:
J'ai beaucoup cherché et trouvé des postes dans les stackoverflow mais je n'ai pas eu l'échec.
Error: failed to serialize user into session
at pass (c:\Development\private\aortmann\bootstrap_blog\node_modules\passport\lib\passport\index.js:275:19)
Mon code ressemble à ceci.
'use strict';
var express = require('express');
var path = require('path');
var fs = require('fs');
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var nodemailer = require('nodemailer');
var app = express();
module.exports = function setupBlog(mailTransport, database){
var config = JSON.parse(fs.readFileSync('./blog.config'));
app.set('view options', {layout: false});
app.use(express.static(path.join(__dirname, '../', 'resources', 'html')));
app.use(express.bodyParser());
app.use(express.cookieParser());
app.use(express.session({ secret: 'secret' }));
app.use(passport.initialize());
app.use(passport.session());
app.get('/blog/:blogTitle', function(req, res) {
var blogTitle = req.params.blogTitle;
if(blogTitle === 'newest'){
database.getLatestBlogPost(function(post) {
res.send(post);
});
} else {
database.getBlogPostByTitle(blogTitle, function(blogPost) {
res.send(blogPost);
});
}
});
passport.use(new LocalStrategy(function(username, password, done) {
//database.login(username, password, done);
if (username === 'admin' && password === 'admin') {
console.log('in');
done(null, { username: username });
} else {
done(null, false);
}
}));
app.post('/login', passport.authenticate('local', {
successRedirect: '/accessed',
failureRedirect: '/access'
}));
app.listen(8080);
console.log('Blog is running on port 8080');
}();
Grâce.
Vous devez vous connecter pour publier un commentaire.
Il semble que vous n'avez pas à mettre en œuvre
passport.serializeUser
etpassport.deserializeUser
. Essayez d'ajouter ceci:serializeUser
fonction stocke simplement l'id de l'utilisateur dans la session, etdeserializeUser
utilise cet id pour récupérer les données de l'utilisateur à partir d'une base de données (par exemple). C'est pour éviter le stockage de session à partir d'contenant les véritables données de l'utilisateur lui-même.app.use(...)
, etc.Si vous décidez de ne pas utiliser les sessions, vous pouvez définir la session de faux
Les sons que vous avez manqué une partie de la passportjs de l'installation, plus précisément de ces deux méthodes:
J'ai ajouté un peu sur
._id
vs.id
mais cet extrait est tiré de la Section Configurer de docs, de donner une autre lecture et bonne chance 🙂Ici un travail, mais encore de la manière paresseuse pour utiliser les sessions, et encore "serialisize" les valeurs.
dans le cas ou des erreurs étranges demandez-vous simplement: "Dois-je rlly set '_id' dans mon objet utilisateur?" - dans la plupart des cas, vous n'avez pas. Il faut donc utiliser un attribut propre en tant que clé.
À l'aide de Promesse avec serializeUser & deserializeUser:
Veuillez consulter mon dépôt github pour un code exemple comment résoudre ce problème.
dans le passeport.utilisation ("local, connexion...)/ou /('local-singup'...)
si err, vous devrez retourner "false"
err {return fait(null, req.flash('megsign', 'nom d'utilisateur existe déjà #!#'));}
vrai {return fait(null, false, req.flash('megsign', 'nom d'utilisateur existe déjà #!#'));}