在护照存储库中的oauth2策略使用示例中,提供了以下函数:
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);
});
}
));
护照如何获取profile
字段? 它是否由 OAuth 终结点提供令牌? 还是来自单独的(与会话相关的)请求?
例如,当使用Facebook的oauth API时,用户信息会自动加载Passport的Facebook策略,所以我试图弄清楚这是如何发生的,以及如何在自定义oauth2 API中实现类似的行为。
用户配置文件通常在成功检索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