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

Moh*_*ssi 7 php google-oauth google-api-php-client

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

直到昨天,一切都进展顺利。

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

我调试代码,发现当 Google_Client 尝试 verifyIdToken 时崩溃,更准确地说是在函数 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"];

    ...
Run Code Online (Sandbox Code Playgroud)

谁能提供解释吗?提前致谢

Edd*_*Goh 7

有些我在谷歌中没有找到任何答案。因此,我将分享我为使其发挥作用所做的工作。

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

长答案如下:

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

  1. 经过Google登录认证后,我们将从oauthplayground获取“授权码” (用于测试)。使用前请在设置中输入您的oauth client_id和。oauth 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. 然后您将在 中获得所需的正确信息,例如名称、aud、exp、iss 等$payload

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

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