我的应用很简单,它连接到Google+ API以对用户进行身份验证,如果成功,它会检索用户的电子邮件,然后根据电子邮件对给定数据库执行一系列操作检索。
我的主要问题是每小时,我的访问令牌都会过期,而我似乎不知道如何“刷新”它。我得到以下错误,我想是预期的:
The OAuth 2.0 access token has expired, and a refresh token is not available.
我目前正在将访问令牌存储在数据库中,因此我可以根据需要进行检索。我唯一的问题是如何使用该令牌获得新的令牌?
答案 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