我的应用程序很简单,它连接到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