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

Dea*_*ean 3 php oauth oauth-2.0 google-oauth

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

Error refreshing the OAuth2 token, message: '{
"error" : "invalid_grant"
}'
Run Code Online (Sandbox Code Playgroud)

我看过以前几次将此问题发布到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);
Run Code Online (Sandbox Code Playgroud)

DaI*_*mTo 5

Invalid_Grant有两个可能的原因

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

您说过您的代码会工作一段时间,然后停止工作。这使我认为您的问题是nr 2。

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

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

要解决您的问题,您需要尝试找出上述3个问题中的哪一个导致您的刷新令牌过期。我真的无法为您提供很多帮助,因为它需要您进行一些侦探工作。