web-dev-qa-db-fra.com

Passport + Node.js / Connexion automatique après l'ajout d'un utilisateur

J'utilise un passeport pour l'authentification et le traitement des sessions. Tout fonctionne bien jusqu'à présent. J'ai implémenté un formulaire "Connexion" pour ajouter de nouveaux utilisateurs à l'application. Après l'ajout d'un utilisateur, je voudrais le connecter automatiquement.

Quelle est la meilleure façon d'y parvenir - dois-je rediriger vers "/ login" avec les informations d'identification de l'utilisateur ou existe-t-il une autre/meilleure façon (appeler serializeUser) de le faire?

Jusqu'à présent, je pense que je n'ai pas vraiment compris le fonctionnement de la fonction "done" (dans serializeUser et LocalStrategy) ou ce qu'elle fait ...

Voici mon code:

passport.serializeUser(function(user, done) {
    done(null, user._id);
});
passport.deserializeUser(function(id, done) {
    authProvider.findUserById('users', id, function (err, user) {
        done(err, user);
    });
});

passport.use(new LocalStrategy( function(email, password, done) {
    authProvider.getUserByEmail('users', email, function(error, user){
        if(error) { return done(error); }
        if (!user) { return done(null, false, { message: 'Unknown user ' + email });}   
        if (user.password != password) { return done(null, false);}
        return done(null, user);
        });
    }
));

app.post('/login', 
    passport.authenticate('local', { failureRedirect: '/login'}),
    function(req, res) { res.redirect('/');});

app.post('/sign', function(req, res){
    authProvider.saveUser(...do stuff), function(error, user){
        if(error){
            res.redirect('/sign');
        } else {
            res.redirect('/');
        }
    });
});

Est-ce que quelqu'un sait comment faire ça?

33
user937284

Veuillez utiliser le code de la réponse @Weston ci-dessous , car il est plus universel et simple

Devrait ressembler à quelque chose comme ça

app.post('/sign', function(req, res){
    authProvider.saveUser(...do stuff), function(error, user){
        if(error){
            res.redirect('/sign');
        } else {
            passport.authenticate('local')(req, res, function () {
                res.redirect('/account');
            })
        }
    });
});         

Je ne suis pas sûr du nom de la stratégie, mais par défaut, LocalStrategy devrait fournir un nom "local"

http://passportjs.org/guide/authenticate/

12
krasu

Basé sur le Guide du passeportreq.login() est destiné à cet usage précis.

Cette fonction est principalement utilisée lorsque les utilisateurs s'inscrivent, pendant laquelle req.login() peut être invoquée pour se connecter automatiquement au nouvel utilisateur enregistré.

Modification du code de krasu:

app.post('/sign', function(req, res){
    authProvider.saveUser(...do stuff), function(error, user){
        if ( error ){
            res.redirect('/sign');
        } else {
            req.login(user, function (err) {
                if ( ! err ){
                    res.redirect('/account');
                } else {
                    //handle error
                }
            })
        }
    });
});

L'erreur potentielle de la fonction de rappel login() proviendrait de votre fonction serializeUser().

41
Weston

Essayez avec:

app.post('/sign', function(req, res){
    authProvider.saveUser(...do stuff), function(error, user){
        passport.authenticate('local', (err, user) => {
            req.logIn(user, (errLogIn) => {
                if (errLogIn) {
                    return next(errLogIn);
                }
                return res.redirect('/account');
            });
        })(req, res, next);
    });
});
0
alditis