【问题标题】:Use OAuth Refresh Token to Obtain New Access Token - Google API使用 OAuth 刷新令牌获取新的访问令牌 - Google API
【发布时间】:2014-07-15 20:45:41
【问题描述】:

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    哇,我花了很长时间才弄清楚这一点,而且那里的答案对我来说似乎很不完整。

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

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

    $gClient->setAccessType('offline');
    

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

    $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,那么即使用户之前同意您的应用程序针对给定的一组范围,用户也会看到一个同意页面。 这反过来又确保了 @987654338每次授权都提供@。

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

    【讨论】:

    猜你喜欢
    • 2015-11-26
    • 2013-06-14
    • 2017-06-09
    • 1970-01-01
    • 2019-06-29
    • 1970-01-01
    • 2013-09-05
    • 1970-01-01
    • 2013-11-05
    相关资源
    最近更新 更多