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"
}'

我已经查看了以前将此问题发布到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);

Invalid_Grant有两个可能的原因

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

您说您的代码工作了一段时间然后停止工作。 这让我认为你的问题是 nr 2。

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

  1. 有问题的用户已撤销您的身份验证。
  2. 如果刷新令牌在 6 个月内未使用,则会自动过期。
  3. 刷新令牌基于项目(客户端 ID)和用户。 如果用户对应用程序进行身份验证,则会获得刷新令牌。 如果他们再次执行此操作,您将获得另一个刷新令牌。第一个仍将与第二个一样工作。 用户对代码进行身份验证 27 次后,最多可以有 26 个实时刷新令牌,您将丢失第一个刷新令牌。

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