web-dev-qa-db-fra.com

Passport.js - Erreur: échec de la sérialisation de l'utilisateur en session

J'ai un problème avec le module Passport.js et Express.js.

Ceci est mon code et je veux juste utiliser un login en dur pour le premier essai.

Je reçois toujours le message:

J'ai beaucoup cherché et trouvé quelques articles dans 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');

}();

Merci.

156
user2244925

On dirait que vous n'avez pas implémenté passport.serializeUser et passport.deserializeUser. Essayez d'ajouter ceci:

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

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

Si vous décidez de ne pas utiliser de sessions, vous pouvez définir la session sur false.

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

On dirait que vous avez oublié une partie de la configuration de passportjs, plus précisément ces deux méthodes:

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

J'ai ajouté le bit à propos de ._id vs. .id mais cet extrait provient de la section Configurer de la documentation, donnez-lui une autre lecture et bonne chance :)

16
electblake

Voici un moyen efficace mais toujours paresseux d’utiliser des sessions tout en "sérialisant" les valeurs.

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]);
});

au cas ou d'erreurs étranges, demandez-vous simplement: "Dois-je définir '_id' dans mon objet utilisateur?" - dans la plupart des cas, vous ne le faites pas. Utilisez donc un attribut approprié comme clé.

2
Ganku Caelestis

Utilisation de Promise avec serializeUser et 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}`);
    });
});

S'il vous plaît voir mon github repo pour un exemple de code complet comment résoudre ce problème.

0
Isak La Fleur