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


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

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

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

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


12832
2018-05-27 04:09


起源



答案:


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

在我们开始之前,请记住,这个答案假定您使用的是最新版本 Google API PHP库, 作为 2014年5月26日

1 - 确保您的应用程序请求的访问类型 offline。一个 refresh_token 是 不提供 除此以外。来自Google: 仅当授权代码请求中包含access_type = offline时,才会显示此字段。

$gClient->setAccessType('offline');

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

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

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


16
2018-05-27 04:09



好的,我知道谢谢你的评论被堆栈所折服但是。谢谢。一直玩这个打开和关闭一个星期。 :) - DaImTo
@ daniel_c05你能帮帮我吗? stackoverflow.com/questions/33870439/... - Prafulla Kumar Sahu


答案:


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

在我们开始之前,请记住,这个答案假定您使用的是最新版本 Google API PHP库, 作为 2014年5月26日

1 - 确保您的应用程序请求的访问类型 offline。一个 refresh_token 是 不提供 除此以外。来自Google: 仅当授权代码请求中包含access_type = offline时,才会显示此字段。

$gClient->setAccessType('offline');

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

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

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


16
2018-05-27 04:09



好的,我知道谢谢你的评论被堆栈所折服但是。谢谢。一直玩这个打开和关闭一个星期。 :) - DaImTo
@ daniel_c05你能帮帮我吗? stackoverflow.com/questions/33870439/... - Prafulla Kumar Sahu