使用OAuth刷新令牌获取新的访问令牌-谷歌API


Use OAuth Refresh Token to Obtain New Access Token - Google API

我的应用程序很简单,它连接到Google+ API来验证用户,如果成功,它检索用户的电子邮件,然后根据检索到的电子邮件在给定的数据库上执行一系列操作。

我的主要问题是,每小时,我的访问令牌到期,我似乎不知道如何"刷新"它。我得到了以下错误,我认为这是意料之中的:

The OAuth 2.0 access token has expired, and a refresh token is not available.

我当前将访问令牌存储在数据库中,因此可以在需要时检索。我唯一的问题是我如何用那个令牌来获得一个新的?

哇,我花了很长时间才弄明白这个问题,而且答案对我来说似乎相当不完整。

在我们开始之前,请记住,这个答案假设您正在使用最新的Google API PHP库,截至 2014年5月26日

1 -确保您的应用程序请求的访问类型是offline。如果不提供,则refresh_token。来自Google: 此字段仅在授权码请求中包含access_type=offline时出现。

$gClient->setAccessType('offline');

2 -第一次授权时,保留提供的refresh_token以供后续访问。这可以通过cookie 数据库等来实现。我选择存储在一个数据库中:

$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和Revoke Access到你的应用程序,或者你可以在创建客户端对象时添加以下行:

$gClient->setApprovalPrompt('force');

From Google: 如果该值为force,则用户将看到一个同意页面,即使他们之前已经同意了给定范围的应用程序。这反过来又确保在每次授权时提供refresh_token

完整示例如下:http://pastebin.com/jA9sBNTk