使用带有多种策略的passport.js而不覆盖用户请求对象

时间:2014-10-19 17:50:00

标签: javascript node.js passport.js

我正在使用passport.js local-strategy for auth。我还需要用户通过Facebook,Twitter和G +进行身份验证,但作为身份验证替代方案,但要让用户从这些服务中检索其内容。

如上所述,每个auth策略都将用户对象写入请求对象。这具有注销我的root用户的效果。有没有办法利用护照来实现这些额外的身份验证策略,但是不能覆盖用户对象?

以下是规范示例:

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
    });
  }
));

2 个答案:

答案 0 :(得分:4)

执行此操作的方法是使用回调而不是重定向。通常,您可以调用req.login()来设置请求对象。您可以跳过该步骤并根据响应执行任何操作。

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)
    });

答案 1 :(得分:4)

这在Passport文档中列出。 http://passportjs.org/guide/authorize/