Passport.js如何使用OAuth2策略获取配置文件数据?

时间:2014-02-19 23:43:32

标签: facebook oauth passport.js

在Passport回购中的oauth2策略使用的example中,提供了以下功能:

passport.use(new OAuth2Strategy({
    authorizationURL: 'https://www.example.com/oauth2/authorize',
    tokenURL: 'https://www.example.com/oauth2/token',
    clientID: EXAMPLE_CLIENT_ID,
    clientSecret: EXAMPLE_CLIENT_SECRET,
    callbackURL: "http://localhost:3000/auth/example/callback"
  },
  function(accessToken, refreshToken, profile, done) {
    User.findOrCreate({ exampleId: profile.id }, function (err, user) {
      return done(err, user);
    });
  }
));

Passport如何获得profile字段?是否由oauth端点提供令牌?或者它来自单独的(与会话相关的)请求?

当使用Facebook的oauth API时,用Passport的Facebook策略自动 加载用户信息,所以我试图弄清楚这是如何发生的,以及如何实现自定义oauth2 API中的类似行为。

1 个答案:

答案 0 :(得分:2)

通常在成功检索access_token后加载用户个人资料:

https://github.com/jaredhanson/passport-oauth2/blob/master/lib/strategy.js#L175

 this._oauth2.getOAuthAccessToken(code, { grant_type: 'authorization_code', redirect_uri: callbackURL  },
      function(err, accessToken, refreshToken, params) {
        if (err) { return self.error(self._createOAuthError('Failed to obtain access token', err)); }

        self._loadUserProfile(accessToken, function(err, profile) {
          if (err) { return self.error(err); }

实际获取用户信息的功能通常由特定策略(例如Facebook,Twitter等)提供

在Facebook的实施中:

https://github.com/jaredhanson/passport-facebook/blob/master/lib/strategy.js#L137