tutorial node example node.js express login passport.js passport-local

node.js - node - passport npm



Error: no se pudo serializar al usuario en la sesiĆ³n (5)

Hola tengo un problema con el módulo de pasaporte y expreso.

Este es mi código y solo quiero utilizar un inicio de sesión codificado para el primer intento.

Siempre recibo el mensaje:

Busqué mucho y encontré algunas publicaciones en stackoverflow pero no obtuve el error.

Error: failed to serialize user into session at pass (c:/Development/private/aortmann/bootstrap_blog/node_modules/passport/lib/passport/index.js:275:19)

Mi código se ve así.

''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''); }();


Aquí una forma de trabajo, pero todavía floja, de usar sesiones y aún "serializar" los valores.

var user_cache = {}; passport.serializeUser(function(user, next) { let id = user._id; user_cache[id] = user; next(null, id); }); passport.deserializeUser(function(id, next) { next(null, user_cache[id]); });

en caso de errores extraños solo pregúntese: "¿Configuraría ''_id'' en mi objeto de usuario?" - En la mayoría de los casos, no. Entonces usa un atributo apropiado como clave.


Parece que no implementó passport.serializeUser y passport.deserializeUser . Intenta agregar esto:

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


Parece que te perdiste una parte de la configuración del pasaporte, específicamente estos dos métodos:

passport.serializeUser(function(user, done) { done(null, user._id); // if you use Model.id as your idAttribute maybe you''d want // done(null, user.id); }); passport.deserializeUser(function(id, done) { User.findById(id, function(err, user) { done(err, user); }); });

._id el bit sobre ._id vs. .id pero este fragmento es de la sección Configure of docs, dale otra lectura y buena suerte :)


Si decide no usar sesiones, puede establecer la sesión en falso

app.post(''/login'', passport.authenticate(''local'', { successRedirect: ''/accessed'', failureRedirect: ''/access'', session: false }));


Uso de Promise con serializeUser & deserializeUser:

passport.serializeUser((user, done) => { done(null, user.id); }); passport.deserializeUser((id, done) => { // console.log(`id: ${id}`); User.findById(id) .then((user) => { done(null, user); }) .catch((error) => { console.log(`Error: ${error}`); }); });

Por favor, consulte mi repositorio github para obtener un ejemplo completo de cómo solucionar este problema.