Google始终返回错误的验证ID令牌

时间:2017-07-25 09:10:08

标签: php google-signin

我有下一个代码,直接来自谷歌参考(https://developers.google.com/identity/sign-in/web/backend-auth

public function verifyFromAndroid($idToken=null) {
        if(empty($idToken)) {
            $idToken = self::SAMPLE_ID_TOKEN;
        }
        $client = new Google_Client(['client_id' => self::CLIENT_ID]);
        $payload = $client->verifyIdToken($idToken);
        if ($payload) {
            print_r($payload);
          $userid = $payload['sub'];
          // If request specified a G Suite domain:
          //$domain = $payload['hd'];
        } else {
            var_dump($payload);
          $this->lastError = "Invalid ID token";
          return false;
        }
    }

但是这个方法总是返回false,即使使用创建的有效id令牌并使用oauthplayground在线工具工作也是如此。 https://developers.google.com/oauthplayground/

下一个代码可以正常工作,直接使用GoogleAccessToken_Verify类。有人可以告诉我为什么官方Google代码不起作用,是我自己的代码使用官方Google-clien-php sdk?

try {
            $verify = new Google_AccessToken_Verify();
            $result = $verify->verifyIdToken($this->idToken);
            if($result) {

                print_r($result);
                $friendlyData = $this->translateData($result, true);
                if(!$friendlyData) {
                    return false;
                }
                return $friendlyData;
            }
            else {
                $this->lastError = "Invalid token verification, no error code";
                return false;
            }
        }
        catch(UnexpectedValueException $ex) {
            $this->lastError = "UnVaEx (Code {$ex->getCode()}): {$ex->getMessage()}";
            return false;
        }

3 个答案:

答案 0 :(得分:0)

尝试添加完整的客户端ID

  

xxxxxxxxxxxxxx-xxxxx-yy-zz.apps.googleusercontent.com

启动

  

$ client =新的Google_Client(['client_id'=> self :: CLIENT_ID]);

应该可以,我也面临着同样的问题...

答案 1 :(得分:0)

有一个类似的问题。在Firebase控制台上删除了我的android应用,并创建了一个带有调试密钥sha1的新应用,然后下载并替换了google.json到我的应用中。这解决了我的问题。有时您只需要在Firebase控制台上重新创建android应用即可。

答案 2 :(得分:0)

在使用{strong>配置项目按钮开始在https://developers.google.com/identity/sign-in/web/sign-in注册后端URL之前,请不要在代码中使用任何凭据或api密钥。完成之后,您的代码应该看起来像这样。

public function verifyFromAndroid($idToken=null) {
    if(empty($idToken)) {
        $idToken = self::SAMPLE_ID_TOKEN;
    }
    //As you notice we don't use any key as a parameters in Google_Client() API function
    $client = new Google_Client();
    $payload = $client->verifyIdToken($idToken);
    if ($payload) {
        print_r($payload);
        $userid = $payload['sub'];
        // If request specified a G Suite domain:
        //$domain = $payload['hd'];
    } else {
        var_dump($payload);
        $this->lastError = "Invalid ID token";
        return false;
    }
}

我希望这会有所帮助。