我有一个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"];
...
有人可以提供解释吗? 提前感谢
答案 0 :(得分:0)
有些我在Google找不到答案的方法。因此,我将分享使它起作用的工作。
简短答案:因为您在verifyIdToken()中使用的令牌无效。
长答案如下:
我不确定这是否是正确的步骤:
oauth client_id
和oauth client secret
。$token = $client->fetchAccessTokenWithAuthCode("THE_AUTHORIZATION_CODE");
$token
内部,我收到以下消息:access_token, token_type, expires_in, refresh_token, id_token, created
。id_token
中的$payload = $client->verifyIdToken(id_token);
$payload
中获得所需的正确信息,例如名称,aud,exp,iss等。注意:为避免代码再次返回“令牌中的段数错误”错误,您必须尝试捕获verifyIdToken
方法
try {
$payload = $client->verifyIdToken(id_token);
}
catch (Exception $e) {
echo "Invalid id token";
}