使用 OAuth 刷新令牌获取新的访问令牌 - Google API
Posted
技术标签:
【中文标题】使用 OAuth 刷新令牌获取新的访问令牌 - Google API【英文标题】:Use OAuth Refresh Token to Obtain New Access Token - Google API 【发布时间】:2014-07-15 20:45:41 【问题描述】:我的应用很简单,它连接到 Google+ API 对用户进行身份验证,如果成功,它会检索用户的电子邮件,然后根据电子邮件对给定数据库执行一系列操作取回。
我的主要问题是每个小时,我的访问令牌都会过期,我似乎不知道如何“刷新”它。我收到以下错误,我想这是预期的:
The OAuth 2.0 access token has expired, and a refresh token is not available.
我目前将访问令牌存储在数据库中,因此可以在需要时进行检索。我唯一的问题是如何使用该令牌来获得新令牌?
【问题讨论】:
【参考方案1】:哇,我花了很长时间才弄清楚这一点,而且那里的答案对我来说似乎很不完整。
在我们开始之前,请记住,此答案假定您使用的是最新的 Google API php Library,截至 2014 年 5 月 26 日。
1 - 确保您的应用请求的访问类型为 offline
。 refresh_token
否则不提供。来自 Google:只有在授权码请求中包含 access_type=offline 时才会显示此字段。
$gClient->setAccessType('offline');
2 - 首次授权后,保留提供的refresh_token
以供进一步访问。这可以通过 cookies、database 等来完成。我选择存储在数据库中:
$tokens = json_decode($gClient->getAccessToken()); /* Get a JSON object */
setRefreshToken($con, $tokens->refresh_token /* Retrieve form JSON object */);
3 - 检查AccessToken
是否已过期,如果是,请向 Google 请求刷新令牌。
if ($gClient->isAccessTokenExpired())
$refreshToken = getRefreshToken($con, $email);
$gClient->refreshToken($refreshToken);
getRefreshToken
从我们的数据库中检索先前存储的refresh_token
,然后我们将该值传递给客户端的refreshToken
方法。
快速说明:请务必记住,如果您之前授权过您的应用,您可能不会在响应中看到 refresh_token
,因为它仅在我们第一次调用时提供authenticate
。因此,您可以转到https://www.google.com/settings/security 并撤销对您应用的访问权限,也可以在创建客户端对象时添加以下行:
$gClient->setApprovalPrompt('force');
来自 Google:如果值为 force,那么即使用户之前同意您的应用程序针对给定的一组范围,用户也会看到一个同意页面。 这反过来又确保了 @987654338每次授权都提供@。
完整示例:http://pastebin.com/jA9sBNTk
【讨论】:
好的,我知道谢谢 cmets 不赞成堆栈,但是。谢谢。一个星期以来一直在玩这个。 :) @daniel_c05 你能帮我吗***.com/questions/33870439/…以上是关于使用 OAuth 刷新令牌获取新的访问令牌 - Google API的主要内容,如果未能解决你的问题,请参考以下文章
使用 OAuth 刷新令牌获取新的访问令牌 - Google API
如何从 passportjs 中的刷新令牌中获取新的 Google oauth 访问令牌