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