使用 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 - 确保您的应用请求的访问类型为 offlinerefresh_token 否则不提供。来自 Google:只有在授权码请求中包含 access_type=offline 时才会显示此字段。

$gClient->setAccessType('offline');

2 - 首次授权后,保留提供的refresh_token 以供进一步访问。这可以通过 cookiesdatabase 等来完成。我选择存储在数据库中:

$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 访问令牌

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

尝试使用spring oauth2中的刷新令牌获取新的访问令牌时出现无效的客户端错误

OAuth 客户端凭据重新颁发访问令牌与刷新令牌

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