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

dan*_*c05 11 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.
Run Code Online (Sandbox Code Playgroud)

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

dan*_*c05 16

哇,我花了很长时间才弄明白这一点,那里的答案对我来说似乎很不完整.

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

1 - 确保您的应用程序请求的访问类型offline.一个refresh_token没有提供其他.来自Google:只有在授权代码请求中包含access_type = offline时,才会显示此字段.

$gClient->setAccessType('offline');
Run Code Online (Sandbox Code Playgroud)

2 - 第一次授权后,坚持提供refresh_token进一步访问权限.这可以通过cookie,数据库等完成.我选择存储在数据库中:

$tokens = json_decode($gClient->getAccessToken()); /* Get a JSON object */
setRefreshToken($con, $tokens->refresh_token /* Retrieve form JSON object */);
Run Code Online (Sandbox Code Playgroud)

3 - 检查是否AccessToken已过期,如果是这种情况,请向Google请求刷新的令牌.

if ($gClient->isAccessTokenExpired()) {    
  $refreshToken = getRefreshToken($con, $email); 
  $gClient->refreshToken($refreshToken);
}  
Run Code Online (Sandbox Code Playgroud)

getRefreshToken被检索以前存储的refresh_token从我们的数据库,然后我们传递价值给客户的refreshToken方法.

快速注意:关键是要记住,如果您之前已经授权了您的应用程序,您可能不会看到refresh_token响应,因为它仅在我们第一次打电话时提供authenticate.因此,您可以访问https://www.google.com/settings/security撤消对应用的访问权限,也可以在创建客户端对象时添加以下行:

$gClient->setApprovalPrompt('force');
Run Code Online (Sandbox Code Playgroud)

来自Google:如果值为force,则用户会看到同意页面,即使他们之前已就同一组范围同意您的应用程序.这反过来确保refresh_token在每个授权上提供a .

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