【问题标题】:Current method to get new access token from refresh token从刷新令牌获取新访问令牌的当前方法
【发布时间】:2023-03-22 23:10:01
【问题描述】:

我在 Google API Node.js 客户端 OAuth API(例如,thisthis)中似乎不推荐使用的解决方案中看到了一些与此相关的问题。

我没有看到有关使用刷新令牌获取新访问令牌 (docs section) 的文档。 In an issue from early 2017,有人提到要关闭 oauth2Client.credentials 属性,但看起来这是在对包装在包中的其他 API 之一的调用中。

在我的用例中,我正在查询 Google My Business (GMB) API,该 API 未包含在其中,但我正在使用此包的 OAuth 部分进行身份验证并获取我的令牌。

我对 GMB API 的请求(使用 request-promise 模块)如下所示:

function getLocations () {
  return request({
    method: 'POST',
    uri: `${gmbApiRoot}/accounts/${acct}/locations:batchGet`,
    headers: {
      Authorization: `OAuth ${gmbAccessToken}`
    }
  })
  .then(function (response) {
    console.log(response);
  })
  .catch(function (err) {
    // ...
  });
}

我认为我不能像问题响应中那样将oauth2Client 传递到授权标头中。鉴于我的刷新令牌缓存在我的应用程序中,有没有办法直接请求新的access_token

更新:已解决!感谢贾斯汀的帮助。这是我的工作代码的样子:

oauth2Client.setCredentials({
  refresh_token: storedRefreshToken
});

return oauth2Client.refreshAccessToken()
.then(function (res) {
  if (!res.tokens && !res.credentials) {
    throw Error('No access token returned.');
  }

  const tokens = res.tokens || res.credentials;

  // Runs my project-level function to store the tokens.
  return setTokens(tokens);
});

【问题讨论】:

    标签: google-api-nodejs-client google-my-business-api


    【解决方案1】:

    如果您有一个现有的 oauth2 客户端,您只需致电setCredentials

    oauth2client.setCredentials({
      refresh_token: 'REFRESH_TOKEN_YALL'
    });
    

    在通过客户端的下一次调用中,它会自动检测没有访问令牌,注意刷新令牌,并获取新的访问令牌及其到期日期。我在您在 GitHub 上打开的问题中概述了一些文档和代码:P

    https://github.com/google/google-api-nodejs-client/pull/1160/files

    希望这会有所帮助!

    【讨论】:

    • 我不确定我是否理解。我对客户端的唯一用途是获取令牌,所以我不确定下一个会是什么。我能想到的唯一想法是getToken,它需要code。最初授予授权时,我从重定向 URL 中返回了 code,但这里没有。
    • 感谢您的文档更新,顺便说一句。我真的很感激。
    • 一切就绪!在 auth api repo README 中,我看到我可以调用 oauth2Client.refreshAccessToken() 并且更新的令牌在响应中。再次感谢您的帮助!
    【解决方案2】:

    我想将我的学习内容添加到社区中,以防万一它也帮助那些在这方面苦苦挣扎的人。上面的答案是正确的,但我发现了另一个属性。

    也就是说,我是这样调用我的凭据的:

    oAuth2Client.setCredentials(JSON.parse(authResults));
    

    我的 authResults,是这样定义的:

    const authResults = fs.readFileSync(TOKEN_PATH);
    

    这会导致几个字段被填充到结果变量中:

    [
      'access_token',
      'refresh_token',
      'scope',
      'token_type',
      'expiry_date'
    ]
    

    现在这里是细微差别...如果 access_token AND refresh_token 都提供给 setCredentials 调用,则忽略 refresh-token。更改为上述答案,我只发送刷新令牌:

    oAuth2Client.setCredentials({ refresh_token: creds['refresh_token'] });
    

    像冠军一样工作!希望这能找到它的方式并帮助其他人。

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 2015-01-08
      • 2019-09-09
      • 2013-08-23
      • 2021-08-25
      相关资源
      最近更新 更多