如何解决Passport中Node.js不返回刷新令牌?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (65)

我正在尝试使用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。

提问于
用户回答回答于
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

不需要 approvalPrompt不需要prompt

请注意,如果在第一次登录时未捕获并保存refreshToken并将其与用户帐户相关联,则只能在第一次登录时使用,否则无法再轻松获取。

如果在第一次登录时没有捕获它,则有两种选择:

  1. 如果用户登录并且没有针对他们的refreshToken,则可以立即强制登出并告诉他们转至https://myaccount.google.com/permissions并撤消对应用程序的访问,然后再登陆一次。 当他们再次登录时,他们将获得与第一次登录时获得的访问相同的提示,并且您将获得第一次新登录时的refreshToken。只要确保在Passport的回调中有一个方法将refreshToken保存到其数据库中的用户配置文件中。 无论何时需要调用Google API,您都可以使用refreshToken请求旋转的accessToken
  2. 你也可以同时添加accessType: 'offline'prompt: 'consent'选择,但是这可能不是你在一个基于Web的应用程序想要的东西。 每次登录时,使用这些提示都会提示每个用户批准您的应用的访问权限。尽管有这个名字,approvalPrompt并没有强制执行此操作,至少在当前版本的API中没有实施(通过提及它的人数以及oAuth API改变的次数来判断,这种行为以前是完全不同的)。 这对于基于Web的应用程序来说不是一个好方法,因为它不是一个很好的用户体验,但对调试可能很有用。

扫码关注云+社区

领取腾讯云代金券