Passport - Node.js没有返回刷新令牌

Mon*_*757 19 javascript node.js oauth-2.0 passport.js

我试图使用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}]);
  });
}
));
Run Code Online (Sandbox Code Playgroud)

这会将refreshToken返回为undefined.

任何帮助将不胜感激.

Mon*_*757 22

这通过以下链接解决:

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' });
Run Code Online (Sandbox Code Playgroud)

杰瑞德汉森 - 祝福你.

  • 我认为当您重新授权帐户时会发生这种情况.Google不会两次向您提供刷新令牌,但是当您在每次授权时强制执行批准提示时,您都会获得刷新令牌. (4认同)

Iai*_*ins 5

您所需要的就是accessType: 'offline',您将在第一次登录时获得refreshToken

不需要 approvalPromptprompt在请求中。

请注意,如果您不捕获并保存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的应用程序来说,这不是一个好方法,因为它不是很好的用户体验,但可能对调试很有用。