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

时间:2014-05-27 04:09:45

标签: php oauth-2.0 google-oauth google-api-php-client

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

我的主要问题是每小时,我的访问令牌都会过期,而我似乎不知道如何“刷新”它。我得到以下错误,我想是预期的:

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

我目前正在将访问令牌存储在数据库中,因此我可以根据需要进行检索。我唯一的问题是如何使用该令牌获得新的令牌?

1 个答案:

答案 0 :(得分:16)

哇,我花了很长时间来解决这个问题,而那里的答案对我来说似乎相当不完整。

在开始之前,请注意,此答案假设您使用的是最新的Google API PHP Library,截至2014年5月26日

1 - 确保您的应用请求的访问类型为offline。否则refresh_token 未提供。来自Google:仅当授权码请求中包含access_type = offline时,才会显示此字段。

$gClient->setAccessType('offline');

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

$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:如果该值为强制,则即使用户之前已同意您的应用程序以获取给定的一组范围,用户也会看到同意页。这反过来确保了{{em>每个授权都提供1}}。

此处的完整示例:http://pastebin.com/jA9sBNTk