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

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

我的本地主机上有以下代码 运行 以尝试使用 Google Oauth2 进行身份验证。验证后,它似乎可以工作一段时间。然后在一定时间后我得到这个经典错误:

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

我看过之前发布到 Whosebug 的这个问题,但建议的解决方案似乎对我不起作用。

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


    //$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);

Invalid_Grant

有两个可能的原因
  1. 服务器时钟与 NTP 不同步。 (解决时间固定)
  2. 刷新令牌已过期。 (解决方案再次请求身份验证)

您说您的代码可以工作一段时间然后停止工作。这让我觉得你的问题是 nr 2.

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

  1. 相关用户已撤销您的身份验证。
  2. 如果刷新令牌 6 个月未使用,将自动过期。
  3. 刷新令牌基于项目(客户端 ID)和用户。如果用户对您的应用程序进行身份验证,您将获得一个刷新令牌。如果他们再次这样做,您将获得另一个刷新令牌。第一个仍然会像第二个一样工作。一旦用户第 27 次验证您的代码,您最多可以拥有 26 个实时刷新令牌,您将失去第一个刷新令牌。

要解决您的问题,您需要尝试找出以上 3 个问题中的哪一个导致您的刷新令牌过期。我真的帮不了你太多,它需要你做一些侦探工作。