I’m using passport.js local-strategy for auth. I also need users to authenticate with Facebook, Twitter, and G+, but not as auth alternatives, but to enable the user to retrieve their content from those services.
As written, each auth strategy writes a user object to the request object. This has the effect of logging-out my root user. Is there a way to leverage passport for these additional auth strategies, but not override the user object?
Here is the canonical example:
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 }); } ));
Advertisement
Answer
A way to do this is to use a callback rather than a redirect. Usually you would call req.login() to set the request object. You can just skip that step and do whatever you want with the response.
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) });