Passport - Node.js not returning Refresh Token



我正在尝试使用node.js的passport模块返回refreshToken。然而,我正在使用下面的代码,我无法记录任何刷新令牌,但访问令牌工作正常。有没有任何方法可以为这个模块指定离线访问类型,希望能返回这个?

var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy;
passport.use(new GoogleStrategy({
clientID: GOOGLE_CLIENT_ID,
clientSecret: GOOGLE_CLIENT_SECRET,
callbackURL: "http://myurl/auth/callback"
},
function(accessToken, refreshToken, profile, done) {                                                            
console.log(refreshToken);
process.nextTick(function () {
return done(null, [{token:accessToken}, {rToken:refreshToken}, {profile:profile}]);
});
}
));

这将refreshToken返回为未定义。

如有任何帮助,我们将不胜感激。

这是通过以下链接解决的:

https://github.com/jaredhanson/passport/issues/42

特别是:

passport.authenticate('google', { scope: ['https://www.googleapis.com/auth/userinfo.profile',
'https://www.googleapis.com/auth/userinfo.email'],
accessType: 'offline', approvalPrompt: 'force' });

贾里德·汉森——祝福你。

您只需要accessType: 'offline',第一次登录即可获得refreshToken

请求中不需要approvalPromptprompt

注意这只适用于首次登录如果您没有捕获并保存refreshToken并在首次登录时将其与用户帐户关联,则您无法轻松再次获得它。

如果你第一次登录时没有捕捉到它,那么你有两个选择:

  1. 如果用户登录,而您没有refreshToken,您可以立即强制他们注销(例如,通过在应用程序中终止他们的会话),并告诉他们转到https://myaccount.google.com/permissions并撤消对您的应用程序的访问权限,然后重新登录即可

当他们再次登录时,他们将获得与第一次登录时相同的访问提示,并且您将在第一次新登录时获得refreshToken。只需确保在Passport中的回调中有一个方法,即可将refreshToken保存到数据库中的用户配置文件中。

然后,每当需要调用Google API时,您可以使用refreshToken请求轮换accessToken

  1. 您也可以同时添加accessType: 'offline'prompt: 'consent'选项,但这可能不是您在基于web的应用程序中想要的

每次登录时,使用这些将提示每个用户批准访问您的应用程序。尽管有这个名称,approvalPrompt并没有强制执行这一点,至少在当前版本的API中没有强制执行(根据提及它的人数和oAuth API更改的频率判断,这种行为过去完全可能不同)。

对于基于web的应用程序来说,这不是一个好方法,因为它不是一个很好的用户体验,但可能对开发/调试有用。

更多关于第二个选项:

此选项适用于移动或桌面应用程序等场景,在这些场景中,令牌将在本地持久存在(而不是在浏览器中,当缓存被清除或自然过期时,令牌更有可能被清除)。

谷歌限制了他们在应用程序上为用户发布的刷新令牌数量(并且他们会自动且无声地使最旧的令牌无效),因此在网络应用程序中使用这种方法通常是个坏主意,因为用户可能会发现他们最终会被其他浏览器会话注销。