Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Google Oauth2:刷新Oauth2令牌时出错,消息:';{“error”:“invalid”u grant}&“x27”;_Php_Oauth_Oauth 2.0_Google Oauth - Fatal编程技术网

Php Google Oauth2:刷新Oauth2令牌时出错,消息:';{“error”:“invalid”u grant}&“x27”;

Php Google Oauth2:刷新Oauth2令牌时出错,消息:';{“error”:“invalid”u grant}&“x27”;,php,oauth,oauth-2.0,google-oauth,Php,Oauth,Oauth 2.0,Google Oauth,我在本地主机上运行以下代码,以尝试使用GoogleOAuth2进行身份验证。经过身份验证后,它似乎可以工作一段时间。经过一段时间后,我得到了一个经典错误: Error refreshing the OAuth2 token, message: '{ "error" : "invalid_grant" }' 我已经查看了以前将此问题发布到StackOverflow的情况,但建议的解决方案似乎对我不起作用 我相信访问令牌已正确更新(请参阅下面的代码)。我还认为服务器时钟同步正确。我做错了什么 无

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

Error refreshing the OAuth2 token, message: '{
"error" : "invalid_grant"
}'
我已经查看了以前将此问题发布到StackOverflow的情况,但建议的解决方案似乎对我不起作用

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



无效的授权有两种可能的原因

  • 服务器时钟与NTP不同步。(解决方案确定时间)
  • 刷新令牌已过期。(再次请求解决方案身份验证)
  • 您声明您的代码工作了一段时间,然后停止工作。这让我觉得你的问题是NR2

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

  • 有问题的用户已撤消您的身份验证
  • 如果刷新令牌已6个月未使用,则将自动过期
  • 刷新令牌基于项目(客户端Id)和用户。如果用户对您的应用程序进行身份验证,您将获得一个刷新令牌。如果他们再次这样做,您将获得另一个刷新令牌。第一个和第二个仍然有效。一旦用户第27次验证您的代码,您最多可以拥有26个实时刷新令牌,您将失去第一个刷新令牌
    要解决您的问题,您需要尝试找出上面3个问题中的哪一个导致您的刷新令牌过期。我真的帮不了你什么忙,这需要你做一些侦探工作。

    一旦你得到了这个,你能用刷新令牌让它再次工作吗?我认为你的刷新令牌不好,你可能想尝试请求一个新令牌。不,这就是问题的全部。刷新令牌似乎停止工作。然后请求一个新令牌错误发生在
    $google->refreshToken($token)这是因为刷新令牌不再有效,您需要再次请求授权。这将为您提供一个新的refreshtoken,它将再次工作。我认为第三种情况最有可能,因为我经常重新验证以测试代码。我想我应该用请求中接收到的新刷新令牌替换原始刷新令牌?每次获得新的刷新令牌时,您都应该用这种方式替换存储的刷新令牌,这样您就始终拥有最新的刷新令牌。你知道,当我测试我的应用程序时,我遇到了这个问题,我的脑袋在“为什么是26”!就我而言,问题在于时钟。同步了,现在没事了。
    
        //$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);