在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中的类似行为。
答案 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