web-dev-qa-db-fra.com

Comment passer un paramètre supplémentaire à passport.authenticate

(J'ai déjà fait fbStrategy.passReqToCallback = true) Je riffe https://scotch.io/tutorials/easy-node-authentication-linking-all-accounts-together mais je veux utiliser ce service d'authentification sociale pour plusieurs applications, ex : celui qui contrôle le système de chauffage, celui qui allume les arroseurs, etc.

Fondamentalement, si l'une de ces applications vérifie auprès du serveur et n'a pas de jeton correct, elle est redirigée vers ce service d'authentification sociale (social-auth). Lorsque l'utilisateur appuie sur les boutons de connexion sociale, il saisit le paramètre de quelle application il arrive et l'ajoute comme paramètre pour /auth/facebook/:appid

    // send to facebook to do the authentication
    app.get('/auth/facebook/:appId', function(req,res,next){
        passport.authenticate(
            'facebook', { scope : 'email' }
        )(req,res,next);
    });

req de req,res,next est l'enregistrement utilisateur sérialisé. À ce stade, social-auth ne sait pas qui est l'utilisateur.

fbStrategy.passReqToCallback = true;  
passport.use(new FacebookStrategy(fbStrategy,
    function(req, token, refreshToken, profile, done) {
        var email = (profile.emails[0].value || '').toLowerCase()     
        process.nextTick(function() {...

Une fois l'autorisation terminée, je souhaite rediriger vers l'application appelante et j'ai besoin du :appId param pour rouler afin que je puisse revenir sur le bon site.

Maintenant, en général, cela fonctionnerait si je rendais juste une variable comme currentAppId accessible aux différentes stratégies sociales, mais si plusieurs personnes s'authentifiaient en même temps, il est possible qu'un utilisateur retourne à la mauvaise application, ou certaines autres applications des utilisateurs. C'est pourquoi j'ai besoin de appId pour voyager en tant que param vers passport.authenticate. Où devrais-je chercher pour comprendre comment. Puis-je envelopper passport.authenticate ou autrement modifier les choses?

16
mcktimo

Vous pouvez utiliser la demande elle-même pour transférer des paramètres supplémentaires de et vers la fonction de stratégie. Dans l'exemple suivant, les deux paramètres _toParam et _fromParam sont utilisés pour cette préoccupation.

app.get('/auth/facebook/:appId', function(req,res,next){
    req._toParam = 'Hello';
    passport.authenticate(
        'facebook', { scope : 'email' }
    )(req,res,next);
})


fbStrategy.passReqToCallback = true;  
passport.use(new FacebookStrategy(fbStrategy,
    function(req, token, refreshToken, profile, done) {
        console.log(req._toParam);
        req._fromParam = 'Hello 2';
        var email = (profile.emails[0].value || '').toLowerCase()     
    process.nextTick(function() {...

Si vous avez besoin de stocker l'identifiant pour d'autres requêtes, vous pouvez utiliser une carte avec le socket de la requête actuelle comme clé.

11
Manfred Steiner