令牌中的段数错误(OAuth Google Api with php)

时间:2015-11-04 13:33:12

标签: php google-oauth google-api-php-client

我有一个php应用程序,它使用OAuth2对用户的帐户进行身份验证。

直到昨天,一切都运转良好。

但是今天,在没有更改我的代码的情况下,当我尝试访问我的帐户时,在我对我的Google帐户进行身份验证后,我获得了一个空白页。

我调试代码时发现当Google_Client尝试验证内容时崩溃了,更确切地说是在函数verifySignedJwtWithCerts中崩溃,因为:$segments = explode(".", $jwt);找到了4个段而不是3个。

这是我的代码:

...
$client = new Google_Client();
$client->setClientId($clientId);
$client->setClientSecret($clientSecret);
$client->setRedirectUri($redirectUri);
$client->setScopes("email");

if(!isset($_GET['code']))
    header("Location: ".$client->createAuthUrl());
else
{
    $client->authenticate($_GET['code']);
    $_SESSION["access_token"] = $client->getAccessToken();


    if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
      $client->setAccessToken($_SESSION['access_token']);
    } else {
      $authUrl = $client->createAuthUrl();
    }

    $ticket = $client->verifyIdToken();
    if ($ticket) {
        $admin = $ticket->getAttributes();

    }
    $_SESSION["email"] = $admin["payload"]["email"];

    ...

有人可以提供解释吗? 提前感谢

1 个答案:

答案 0 :(得分:0)

有些我在Google找不到答案的方法。因此,我将分享使它起作用的工作。

简短答案:因为您在verifyIdToken()中使用的令牌无效。

长答案如下:

我不确定这是否是正确的步骤:

  1. 经过Google登录身份验证后,我们将获得“授权 代码”(来自oauthplayground(用于测试)。请在使用前在设置中输入oauth client_idoauth client secret
  2. 我已经使用“授权码”通过写来获取其他令牌 $token = $client->fetchAccessTokenWithAuthCode("THE_AUTHORIZATION_CODE");
  3. $token内部,我收到以下消息:access_token, token_type, expires_in, refresh_token, id_token, created
  4. 现在使用id_token中的$payload = $client->verifyIdToken(id_token);
  5. 然后您将在$payload中获得所需的正确信息,例如名称,aud,exp,iss等。

注意:为避免代码再次返回“令牌中的段数错误”错误,您必须尝试捕获verifyIdToken方法

try {
     $payload = $client->verifyIdToken(id_token);
}
catch (Exception $e) {
     echo "Invalid id token";
}