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

Posted

技术标签:

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

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

我没有看到有关使用刷新令牌获取新访问令牌 (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);
);

【问题讨论】:

【参考方案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'] );

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

【讨论】:

以上是关于从刷新令牌获取新访问令牌的当前方法的主要内容,如果未能解决你的问题,请参考以下文章

如何从 passportjs 中的刷新令牌中获取新的 Google oauth 访问令牌

Laravel 从登录中获取生成的刷新令牌

在 JavaScript 中存储刷新令牌,获取新的访问令牌

使用 OAuth 2.0 Google App Engine 刷新访问令牌

(JAVA) Google API 分析 - 无法使用“刷新令牌”获取新的“访问令牌”

如何从刷新令牌中获取访问令牌?刷新令牌会过期吗?