2

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

我没有看到有关使用刷新令牌获取新访问令牌的文档(文档部分)。在 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);
});
4

2 回答 2

2

如果您有一个现有的 oauth2 客户端,您需要做的就是调用setCredentials

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

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

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

希望这可以帮助!

于 2018-05-10T17:26:00.897 回答
1

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

也就是说,我这样称呼我的凭据:

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

我的 authResults 定义如下:

const authResults = fs.readFileSync(TOKEN_PATH);

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

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

现在这里是细微差别...如果 access_tokenrefresh_token 都被赋予 setCredentials 调用,则刷新令牌被忽略。更改为上述答案,我只发送刷新令牌:

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

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

于 2021-09-21T16:42:20.103 回答