当前从刷新令牌获取新访问令牌的方法

Current method to get new access token from refresh token

我在 Google APIs Node.js 客户端 OAuth API 中看到一些关于此的解决方案似乎已弃用的问题(例如,this and ).

我看不到关于使用刷新令牌获取新访问令牌的文档(docs section). In an issue from early 2017,有人提到离开 oauth2Client.credentials 属性,但它看起来像在调用包裹中的其他 API 之一时。

在我的用例中,我正在查询 Google 我的业务 (GMB) 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 传递到 headers 以获得授权。鉴于我在我的应用程序中缓存了刷新令牌,有没有办法直接请求新的 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);
});

如果您已有 oauth2 客户端,您只需调用 setCredentials:

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

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

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

希望对您有所帮助!

我想将我的学习添加到社区中,以防它能帮助那些也在努力解决这个问题的人。上面的答案是正确的,但我发现了另一个属性。

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

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 调用时,刷新令牌将被忽略。更改为上面的答案,我只发送刷新令牌:

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

工作出色!希望这能找到它的方式并帮助其他人。