Подтверждение Google в Интернете привело меня к сумасшедшему...
Я создаю простое веб-приложение, и я пытаюсь интегрировать функцию входа Google на веб-сайт (https://developers.google.com/identity/sign-in/web/).
JavaScript, похоже, прошел достаточно хорошо, и следующим шагом было проверить id_token
, который я получал на моем бэкэнд-сервере (опять же, против рекомендации Google: https://developers.google.com/identity/sign-in/web/backend-auth).
Это веб-приложение на основе PHP, и я успешно установил библиотеку API клиента Google с помощью композитора: composer require google/apiclient
, но при отправке значения моего id_token
в мою внутреннюю систему PHP я постоянно получаю следующую ошибку
Firebase\JWT\SignatureInvalidException
File: .\vendor\firebase\php-jwt\src\JWT.php:112
Message: Signature verification failed
Stack trace:
#0 .\vendor\google\apiclient\src\Google\AccessToken\Verify.php(103): Firebase\JWT\JWT::decode('eyJhbGciOiJSUzI...', '-----BEGIN PUBL...', Array)
#1 .\vendor\google\apiclient\src\Google\Client.php(712): Google_AccessToken_Verify->verifyIdToken('eyJhbGciOiJSUzI...', '10...')
Я также использовал значение id_token
в конечной точке "tokeninfo" Google (https://www.googleapis.com/oauth2/v3/tokeninfo?id_token=ABC123), а id_token
проверяет отлично, поэтому я уверен, что это не значение id_token
, которое неправильно. Он также отлично передает его через переменную POST в PHP скрипт, поэтому я немного теряю.
Здесь мой код:
JavaScript:
<script src="https://apis.google.com/js/platform.js?onload=googleAppStart" async defer></script>
<script>
var googleAppStart = function(){gapi.load('auth2', initGoogleSignIn);};
var auth = false;
function initGoogleSignIn(){
auth = gapi.auth2.init({
client_id : 'client-id-is-here',
scope : 'profile'
});
auth.attachClickHandler(document.getElementById('my-button'));
auth.isSignedIn.listen(googleSignInChanged);
auth.currentUser.listen(googleCurrentUserChanged);
if (auth.isSignedIn.get() == true)
auth.signIn();
}
function googleSignInChanged(signed_in){}
function googleCurrentUserChanged(user){
var auth_response = user.getAuthResponse();
var id_token = auth_response.id_token;
if (id_token != undefined){
var url = '/verify-google-signin';
var params = {id_token: id_token};
jQuery.post(url, params, function(data){}, 'json');
}
}
</script>
... и мой PHP поймает POST:
<?php
require_once '/vendor/autoload.php';
$credentials = array("client_id" => "client-id-is-here");
$client = new \Google_Client($credentials);
$data = $_POST;
if (isset($data['id_token'])) {
$id_token = trim($data['id_token']);
// Exception generated here...
$payload = $client->verifyIdToken($id_token);
}
?>
Большое вам спасибо за то, что нашли время, чтобы прочитать это и за любую помощь! Он очень благодарен!