从刷新令牌获取新访问令牌的当前方法
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 访问令牌
使用 OAuth 2.0 Google App Engine 刷新访问令牌