web-dev-qa-db-fra.com

le passeport req.isAuthenticated renvoie toujours false, même lorsque je code en dur (null, true)

J'essaie de faire fonctionner ma stratégie locale Passeport. 

J'ai ce middleware mis en place:

passport.use(new LocalStrategy(function(username, password, done) {
    //return done(null, user);
    if (username=='ben' && password=='benny'){
        console.log("Password correct");
        return done(null, true);
    }
    else
        return done(null, false, {message: "Incorrect Login"});
}));

mais alors ici

app.use('/admin', adminIsLoggedIn, admin);

function adminIsLoggedIn(req, res, next) {

    // if user is authenticated in the session, carry on 
    if (req.isAuthenticated())
        return next();

    // if they aren't redirect them to the home page
    res.redirect('/');
}

il échoue toujours et redirige vers la page d'accueil.

Je ne peux pas comprendre pourquoi cela se produit? Pourquoi ne pas authentifier?

Je peux voir dans ma console que Password Correct est en cours d'impression. Pourquoi ça ne marche pas?

34
CodyBugstein

J'ai eu un problème similaire. Peut être dû au middleware de session express nécessaire pour le passeport. Corrigé en utilisant des middlewares dans l'ordre suivant: (Express 4)

var session = require('express-session');

// required for passport session
app.use(session({
  secret: 'secrettexthere',
  saveUninitialized: true,
  resave: true,
  // using store session on MongoDB using express-session + connect
  store: new MongoStore({
    url: config.urlMongo,
    collection: 'sessions'
  })
}));

// Init passport authentication 
app.use(passport.initialize());
// persistent login sessions 
app.use(passport.session());
43
Nitin

Cela pourrait également être un problème avec les appels POST/GET de votre client. J'avais exactement le même problème, mais il s'est avéré que je devais donner à fetch (c'est ce que j'utilisais) l'option credentials:'include' comme suit:

fetch('/...', {
  method: 'POST',
  headers: myHeaders,
  credentials: 'include',
  body: ...
  ...})

La raison en est que fetch ne prend pas en charge la transmission de cookies, ce qui est nécessaire dans ce cas. 

7
Alex H

J'ai eu le même problème en oubliant d'ajouter 

request.login()

sur 

app.post('/login', 
    function(request, response, next) {
        console.log(request.session)
        passport.authenticate('login', 
        function(err, user, info) {
            if(!user){ response.send(info.message);}
            else{

                request.login(user, function(error) {
                    if (error) return next(error);
                    console.log("Request Login supossedly successful.");
                    return response.send('Login successful');
                });
                //response.send('Login successful');
            }

        })(request, response, next);
    }
);

J'espère que cela pourrait aider d'autres personnes qui se sont retrouvés ici pour la même raison que moi.

3
Özgen Eren

Mon problème était que je mis cookie.secure à true même si les données n'étaient pas sur https.

app.use(require('express-session')({
    secret: process.env.sessionSecret,
    cookie: {
        maxAge: 1000 * 60 * 60 * 24 * 7 // 1 week
    },
    store: store,
    resave: false,
    saveUninitialized: false,
    cookie: { secure: false } // Remember to set this
}));

N'oubliez pas de définir les cookies sur false si vous n'utilisez pas https

cookie: { secure: false } // Set to false

De plus, si vous pensez que vous avez https, n'oubliez pas de faire confiance au proxy.

app.set('trust proxy', 1) // trust first proxy
2
Thomas Lindauer

Si vous emballez vos itinéraires comme suit:

module.exports = function(){

router.get('/',(req,res)=>{
 res.send('stuff');
  }

}

Vous devez passer "app et passeport" à vos itinéraires comme suit:

module.exports = function(app,passport){

//routes n stuff

}
0
metal_jacke1

J'ai résolu ce problème en corrigeant mon passport.deserializeUser . J'utilise le mongo natif et comme la plupart des exemples utilisent Mongoose, je suis tombé de nouveau dans le piège _id.

Alors n'oubliez pas de faire du _id un ObjectID mongo lors de la lecture de l'utilisateur dans deserializeUser

passport.deserializeUser(function(user, done) {
    const collection = db.get().collection('users')
    const userId = new mongo.ObjectID(user);
    collection.findOne({_id : userId}, function(err, user) {
        if (err) done(err, null);
        done(null, user);
    });
});

Ma requête ne trouvait pas l'utilisateur car je n'avais pas transformé l'identifiant en ObjectID et aucune erreur n'était indiquée nulle part.

0
Mikko

J'ai également rencontré le même problème alors que la connexion était en cours… .. L'erreur que j'ai commise a été d'appeler le logiciel intermédiaire isLoggedIn avant d'initialiser le passeport ……. que la séquence est écrite dans le bon ordre ..__J'ai écrit dans la séquence suivante

app.use(require('express-session')({
    secret:'short' ,
    resave:false,
  saveUninitialized:false,
  cookie:{secure:false}
}))
app.use(passport.initialize())
app.use(passport.session())
passport.use(new localstrategy(function(username, password, done) {
    User.findOne({ username: username }, function (err, user) {
      if (err) { return done(err); }
      if (!user) { return done(null, false); }
      if (user.password!=password) { return done(null, false); }
      return done(null, user);
    });
  }
))
passport.serializeUser(User.serializeUser())
passport.deserializeUser(User.deserializeUser())
app.use(isLoggedIn); 
0
Suyash Sreekumar

Je faisais également face au même problème, mais @PVThomas me donne une solution, comme ici dans Answers. Mon problème était avec la méthode findById() dans deserialize(). J'utilisais findOne() dans findById() et ensuite je l'ai remplacé par find() et maintenant, req.isAuthenticated() fonctionne correctement. Mon application ne sauvegardait pas req.session.passport.user, elle renvoyait undefined et ensuite, après le remplacement de findOne() par find(), il enregistrait l'ID utilisateur dans req.session.passport.user.

0
Syed Muhammad Asad