Google Oauth2:刷新OAuth2令牌时出错,消息:'{“error”:“invalid_grant”}'

时间:2016-03-08 21:58:49

标签: php oauth oauth-2.0 google-oauth

我在localhost上运行以下代码,尝试使用Google Oauth2进行身份验证。验证后,它似乎工作了一段时间。然后经过一段时间我得到了这个经典错误:

Error refreshing the OAuth2 token, message: '{
"error" : "invalid_grant"
}'

我已经查看过此次将此问题发布到StackOverflow,但建议的解决方案似乎对我不起作用。

我相信访问令牌已正确更新(请参阅下面的代码)。我也相信服务器时钟是正确同步的。我做错了什么?

    //$token retrieved from database
    $token = {"access_token":"xxx.xxx_xxxx-xxx","token_type":"Bearer","expires_in":3600,"refresh_token":"1\/xXxXxxxxxXXXxx","created":145490000}

    $google = new Google_Client();
    $google->setAccessType('offline');
    $google->setClientId($client_id);
    $google->setClientSecret($client_secret);
    $google->setRedirectUri($client_redirect_uri);
    $google->setAccessToken($token);
    if($google->isAccessTokenExpired()) {
      $google->refreshToken($token);
    }
    $token = $google->getAccessToken();
    $google->setAccessToken($token);

    //Some Database code to save the new $token
    ...

    $result = new \Google_Service_YouTube($google);

1 个答案:

答案 0 :(得分:4)

Invalid_Grant

有两个原因
  1. 服务器时钟与NTP不同步。 (解决方案确定时间)
  2. 刷新令牌已过期。 (再次请求解决方案验证)
  3. 你说你的代码工作了一段时间然后停止工作。这让我觉得你的问题是2号。

    刷新令牌停止工作的原因:

    1. 相关用户已撤销您的身份验证。
    2. 如果刷新令牌未使用6个月将自动失效。
    3. 刷新令牌基于项目(客户端ID)和用户。如果用户验证您的应用程序,您将获得刷新令牌。如果他们再次这样做,你会得到另一个刷新令牌。第一个仍然可以工作,第二个。一旦用户验证您的代码,第27次松开第一个刷新令牌,您最多可以拥有26个实时刷新令牌。
    4. 要解决您的问题,您需要尝试找出上述3个问题中的哪一个导致刷新令牌过期。我无法帮助你,因为你需要一些侦探工作。