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