API Google Identity Toolkit для PHP возвращает INVALID_CLIENT
Я пытаюсь заставить API Google Identity Toolkit работать для приложения на основе PHP.
Я следовал Краткому руководству от Google, доступному здесь: https://developers.google.com/identity/toolkit/web/quickstart/php
Я точно следовал за шагами (и проверил и дважды проверил).
Кнопка входа появляется на index.php
стр. Нажав на это перенаправляет на widget.php
стр. Я могу выбрать, в какую учетную запись я хочу войти, а затем, когда вернусь на страницу успешного входа (index.php
еще раз) я получаю следующее сообщение об ошибке:
Неустранимаяошибка: необработанное исключение "Google_Auth_Exception" с сообщением "Ошибка обновления токена OAuth2, сообщение:" { "error": "invalid_client", "error_description": "Клиент OAuth недействителен". }"
Я пытался воссоздать клиент OAuth в консоли разработчика Google. Некоторые результаты поиска, упомянутые для проверки полей Email и Project Name, были заполнены на экране OAuth Consent, что я и сделал.
Любая помощь и совет будет принята с благодарностью. Примечание. Я использую "Google" только из доступных поставщиков в настройках API Identity Toolkit.
Моя страница index.php:
<!DOCTYPE html>
<html>
<head>
<!-- 1: Load the Google Identity Toolkit helpers -->
<?php
set_include_path(get_include_path() . PATH_SEPARATOR . __DIR__ .'/vendor/google/apiclient/src');
require_once __DIR__ . '/vendor/autoload.php';
$gitkitClient = Gitkit_Client::createFromFile(dirname(__FILE__) . '/gitkit-server-config.json');
$gitkitUser = $gitkitClient->getUserInRequest();
?>
<!-- End modification 1 -->
<script type="text/javascript" src="//www.gstatic.com/authtoolkit/js/gitkit.js"></script>
<link type=text/css rel=stylesheet href="//www.gstatic.com/authtoolkit/css/gitkit.css" />
<script type=text/javascript>
window.google.identitytoolkit.signInButton(
'#navbar',
{
widgetUrl: "/gitkit",
signOutUrl: "/index"
}
);
</script>
</head>
<body>
<div id="navbar"></div>
<!-- 2: Print the user information if a signed in user is present -->
<p>
<?php if ($gitkitUser) { ?>
Welcome back!<br><br>
Email: <?= $gitkitUser->getEmail() ?><br>
Id: <?= $gitkitUser->getUserId() ?><br>
Name: <?= $gitkitUser->getDisplayName() ?><br>
Identity provider: <?= $gitkitUser->getProviderId() ?><br>
<?php } else { ?>
You are not logged in yet.
<?php } ?>
</p>
<!-- End modification 2 -->
</body>
</html>
Моя страница gitkit.php:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<!-- Copy and paste here the client configuration from Developer Console into the config variable -->
<script type="text/javascript" src="//www.gstatic.com/authtoolkit/js/gitkit.js"></script>
<link type="text/css" rel="stylesheet" href="//www.gstatic.com/authtoolkit/css/gitkit.css" />
<script type="text/javascript">
var config =
{
"widgetUrl": "http://local.myfakedomain.com/gitkit",
"signInSuccessUrl": "/",
"signOutUrl": "/",
"oobActionUrl": "/",
"apiKey": "<my-api-key-here>",
"siteName": "this site",
"signInOptions": ["password","google"]
}
;
// The HTTP POST body should be escaped by the server to prevent XSS
window.google.identitytoolkit.start(
'#gitkitWidgetDiv', // accepts any CSS selector
config,
JSON.parse('<?php echo json_encode(file_get_contents("php://input")); ?>')
);
</script>
<!-- End modification -->
</head>
<body>
<!-- Include the sign in page widget with the matching 'gitkitWidgetDiv' id -->
<div id="gitkitWidgetDiv"></div>
<!-- End identity toolkit widget -->
</body>
</html>
мой файл gitkit-server-config.json:
{
"clientId": "<my-client-id-here>",
"projectId": "<my-project-id-here>",
"serviceAccountEmail": "<my-serviceAccountEmail-here>",
"serviceAccountPrivateKeyFile": "<my-p12-KeyFile-location-here>",
"widgetUrl": "http://local.myfakedomain.com/gitkit",
"cookieName": "gtoken"
}
3 ответа
У меня была та же проблема, которую я решил, вставив "правильный" адрес электронной почты учетной записи службы в код конфигурации сервера:
{
"clientId": "<my-client-id-here>",
"projectId": "<my-project-id-here>",
"serviceAccountEmail": "<Correct-serviceAccountEmail-here>",
"serviceAccountPrivateKeyFile": "<my-p12-KeyFile-location-here>",
"widgetUrl": "http://local.myfakedomain.com/gitkit",
"cookieName": "gtoken"
}
Хитрость заключается в том, что serviceAccountEmail - это не ваш адрес электронной почты Google, чтобы найти правильный адрес электронной почты, перейдите в раздел " Учетные данные", затем в разделе " Ключи учетных записей служб" щелкните ссылку " Управление учетными записями служб" справа, перейдите к используемой службе и отметьте поле электронной почты. Адрес электронной почты длинный и формат будет примерно таким: service-name@project-name.xxx.xxxxxxxxx.xxx
Помимо электронной почты учетной записи службы (что-то вроде "app-example-com@appname.example.com.iam.gserviceaccount.com", идентификатор проекта вызвал у меня проблемы.
Решение, которое я нашел, состояло в том, что если Google сказал, что ваш projectId - "example.com:appname", измените его на "appname"
В вашем файле gitkit-server-config.json serviceAccountEmail не должен быть пустым. Вы можете скопировать адрес электронной почты учетной записи службы со страницы настроек проекта в консоли разработчика Google.