web-dev-qa-db-fra.com

Obtenir l'objet de demande dans le rappel de stratégie Passport

Voici donc ma configuration pour la stratégie passeport-facebook:

    passport.use(new FacebookStrategy({
        clientID: ".....",
        clientSecret: ".....",
        callbackURL: "http://localhost:1337/register/facebook/callback",
    },
    facebookVerificationHandler
    ));

Et voici facebookVerificationHandler:

var facebookVerificationHandler = function (accessToken, refreshToken, profile, done) { 
    process.nextTick(function () {    
        .......
    });    
};

Existe-t-il un moyen d'accéder à l'objet de demande dans facebookVerificationHandler?

Les utilisateurs sont enregistrés sur mon site avec une stratégie locale, mais ils pourront ensuite ajouter leurs comptes sociaux et associer ces comptes à leurs comptes locaux. Lorsque le rappel ci-dessus est appelé, l'utilisateur actuellement connecté est déjà disponible dans req.user, je dois donc accéder à req pour associer l'utilisateur au compte facebook.

Est-ce la bonne façon de le mettre en œuvre ou dois-je envisager une autre façon de le faire?

Merci.

40
Élodie Petit

Pour cette raison, au lieu de configurer la stratégie au démarrage de l'application, je configure généralement la stratégie en cas de demande. par exemple:

app.get(
    '/facebook/login'
    ,passport_setup_strategy()
    ,passport.authenticate()
    ,redirect_home()
);

var isStrategySetup = false;
var passport_setup_strategy = function(){
    return function(req, res, next){
        if(!isStrategySetup){

            passport.use(new FacebookStrategy({
                    clientID: ".....",
                    clientSecret: ".....",
                    callbackURL: "http://localhost:1337/register/facebook/callback",
                },
                function (accessToken, refreshToken, profile, done) { 
                    process.nextTick(function () {    
                        // here you can access 'req'
                        .......
                    });    
                }
            ));

            isStrategySetup = true;

        }

        next();
    };
}

En utilisant cela, vous aurez accès à la demande dans votre gestionnaire de vérification.

14
ragamufin

Il y a une option passReqToCallback, voir le bas de cette page pour plus de détails: http://passportjs.org/guide/authorize/

89
Jared Hanson

Essaye ça.

exports.facebookStrategy = new FacebookStrategy({
        clientID: '.....',
        clientSecret: '...',
        callbackURL: 'http://localhost:3000/auth/facebook/callback',
        passReqToCallback: true
    },function(req,accessToken,refreshToken,profile,done){
        User.findOne({
                'facebook.id' : profile.id
            },function(err,user){
            if(err){
                done(err);
            }
            if(user){
                req.login(user,function(err){
                    if(err){
                        return next(err);
                    }
                    return done(null,user);
                });
            }else{
                var newUser = new User();
                newUser.facebook.id = profile.id;
                newUser.facebook.name = profile.displayName;
                newUser.facebook.token = profile.token;
                newUser.save(function(err){
                    if(err){
                        throw(err);
                    }
                    req.login(newUser,function(err){
                        if(err){
                            return next(err);
                        }
                        return done(null,newUser);
                    });
                });
            }
        });
    }
);

ser est un modèle mangouste, je sauvegarde l'utilisateur en DB.

18
NarendraSoni