J’ai regardé comment la gestion des erreurs devrait fonctionner dans un nœud via cet échange de stack , mais je ne suis pas sûr de ce que fait le passeport quand il échoue à l’authentification. J’ai le LocalStrategy suivant:
passport.use(new LocalStrategy({ usernameField: 'email', passwordField: 'password' }, function(email, password, next) { User.find({email: UemOrUnm}, function(err, user){ if (err) { console.log('Error > some err'); return next(err); } if (!user) { console.log('Error > no user'); return next('Incorrect login or password'); } if (password != user.password) { return next(Incorrect login or password); } return next(null, user); }); } ));
Après avoir vu ‘Error> some err’ print out, rien ne se passe. Je pense qu’il devrait continuer sur le prochain chemin avec un paramètre d’erreur, mais cela ne semble pas le faire. Que se passe-t-il?
L’implémentation de la stratégie fonctionne conjointement avec passport.authenticate
pour authentifier une demande et gérer le succès / l’échec.
Disons que vous utilisez cette route (qui reçoit une adresse e-mail et un mot de passe):
app.post('/login', passport.authenticate('local', { successRedirect: '/loggedin', failureRedirect: '/login', // see text failureFlash: true // optional, see text as well });
Cela appellera le code dans la stratégie, où l’une des trois conditions peut se produire:
next(err)
; ceci sera géré par Express et générera une réponse HTTP 500; false
tant qu’object utilisateur: next(null, false)
; Cela déclenchera la failureRedirect
(si vous n’en définissez pas, une réponse HTTP 401 non autorisée sera générée); next(null, user)
; cela déclenchera le successRedirect
; En cas d’authentification non valide (mais pas d’erreur interne), vous pouvez transmettre un message supplémentaire avec le rappel:
next(null, false, { message : 'invalid e-mail address or password' });
Si vous avez utilisé failureFlash
et installé le middleware connect-flash , le message fourni est stocké dans la session et vous pouvez y accéder facilement, par exemple, pour l’utiliser dans un modèle.
EDIT: il est également possible de gérer complètement le résultat du processus d’authentification vous-même (au lieu d’envoyer une redirection par Passport ou 401):
app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); // will generate a 500 error } // Generate a JSON response reflecting authentication status if (! user) { return res.send({ success : false, message : 'authentication failed' }); } // *********************************************************************** // "Note that when using a custom callback, it becomes the application's // responsibility to establish a session (by calling req.login()) and send // a response." // Source: http://passportjs.org/docs // *********************************************************************** req.login(user, loginErr => { if (loginErr) { return next(loginErr); } return res.send({ success : true, message : 'authentication succeeded' }); }); })(req, res, next); });
Ce que Christian disait était que vous deviez append la fonction
req.login(user, function(err){ if(err){ return next(err); } return res.send({success:true}); });
Donc tout le parcours serait:
app.post('/login', function(req, res, next) { passport.authenticate('local', function(err, user, info) { if (err) { return next(err); // will generate a 500 error } // Generate a JSON response reflecting authentication status if (! user) { return res.send(401,{ success : false, message : 'authentication failed' }); } req.login(user, function(err){ if(err){ return next(err); } return res.send({ success : true, message : 'authentication succeeded' }); }); })(req, res, next); });
Vous devez append req.logIn(function (err) { });
et faire la redirection de succès dans la fonction de rappel