Utilisation de passport.js avec plusieurs stratégies sans écraser l’object de requête de l’utilisateur

J’utilise passport.js stratégie locale pour l’authentification. J’ai également besoin que les utilisateurs s’authentifient auprès de Facebook, Twitter et G +, mais pas comme des alternatives d’authentification, mais pour permettre à l’utilisateur de récupérer le contenu de ces services.

Tel qu’écrit, chaque stratégie d’authentification écrit un object utilisateur dans l’object de requête. Cela a pour effet de déconnecter mon utilisateur root. Existe-t-il un moyen de tirer parti du passeport pour ces stratégies d’authentification supplémentaires, sans toutefois remplacer l’object utilisateur?

Voici l’exemple canonique:

var passport = require('passport') , TwitterStrategy = require('passport-twitter').Strategy; passport.use(new TwitterStrategy({ consumerKey: TWITTER_CONSUMER_KEY, consumerSecret: TWITTER_CONSUMER_SECRET, callbackURL: "http://www.example.com/auth/twitter/callback" }, function(token, tokenSecret, profile, done) { User.findOrCreate(..., function(err, user) { if (err) { return done(err); } done(null, user); //trashes my existing user object }); } )); 

Une façon de faire est d’utiliser un rappel plutôt qu’une redirection. Habituellement, vous appelez req.login () pour définir l’object de requête. Vous pouvez simplement sauter cette étape et faire ce que vous voulez avec la réponse.

 app.get('/auth/twitter/callback', function (req, res, next) { passport.authenticate('twitter', function (err, user, info) { res.send({err: err, user: user, info: info}); //skip req.login() })(req, res, next) }); 

Ceci est répertorié dans la documentation Passport. http://passportjs.org/guide/authorize/