【问题标题】:Passport - Node.js not returning Refresh TokenPassport - Node.js 不返回刷新令牌
【发布时间】:2014-03-23 10:21:27
【问题描述】:

我正在尝试使用 node.js 的护照模块返回一个 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 返回为未定义。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript node.js oauth-2.0 passport.js


    【解决方案1】:

    这个链接解决了:

    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' });
    

    贾里德·汉森 - 祝福你。

    【讨论】:

    • 这不起作用。仍然将刷新令牌值设为未定义。
    • 您是否包含了approvalPrompt: 'force' 选项?没有这个对我来说它仍然是不确定的。
    • 我认为当您重新授权帐户时会发生这种情况。 Google 不会两次给你刷新令牌,但是当你在每次授权时强制提示批准时,你会得到一个刷新令牌。
    • @MonsterWimp757 解释一下accessType、approvalPrompt是什么意思
    【解决方案2】:

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

    不需要请求中的approvalPromptprompt

    注意这仅适用于首次登录,如果您不捕获并保存 refreshToken 并在首次登录时将其与您无法轻松获取的用户帐户相关联再来一遍。

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

    1. 如果用户登录并且您没有 refreshToken 给他们,您可以立即强制将他们注销(例如,通过在您的应用中使他们的会话过期)并告诉他们转到 @ 987654321@ 并撤消对您的应用程序的访问权限,然后再次登录。

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

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

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

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

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

    更多关于第二个选项:

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

    Google 会限制他们在应用程序上为用户发出的刷新令牌的数量(并且他们会自动且静默地使最旧的令牌失效),因此将这种方法用于网络应用程序通常不是一个好主意,因为用户可能会发现他们最终退出其他浏览器会话。

    【讨论】:

    • 祝福这个人!这很有帮助。特别是您只能在第一次获得刷新令牌并且必须撤销权限才能再次获得它。谢谢!
    • @Wongz 不客气! :-) 如果您将其用于生产,则可能的解决方案是检测是否没有 RefreshToken,然后将用户注销并将其重定向到您网站上的特殊登录页面发送 prompt: 'consent' 以强制 Google 为该用户重新向您的网站发出新的刷新令牌。
    猜你喜欢
    • 2021-11-15
    • 1970-01-01
    • 2016-01-05
    • 2020-09-14
    • 2021-01-18
    • 2018-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多