#php #google-oauth #google-authentication #google-cloud-identity
#php #google-oauth #google-аутентификация #google-cloud-identity
Вопрос:
В моем веб-приложении я хочу реализовать следующий поток
- Пользователь нажимает кнопку Войти с помощью Google
- Пользователь выбирает учетную запись на экране перенаправления
- Я получаю JWT с идентификатором учетной записи и адресом электронной почты
- Я установил идентификатор учетной записи в качестве подсказки для входа и установил запрос только для «согласия»
- Я создаю URL-адрес авторизации и снова перенаправляю в Google для получения согласия
- На следующем экране согласия пользователю нужно будет только подтвердить согласие, а не выбирать свою учетную запись во второй раз
- Я обрабатываю обратный вызов с согласия
Согласно документам, я реализовал обратный вызов из «войти с помощью кнопки Google» следующим образом;
$payload = $client->verifyIdToken($id_token); //Process the JWT
if ($payload) {
$userid = $payload['sub']; //Get the user's unique Google ID
$client->setLoginHint($userid); //Set the user ID as hint for next consent
$client->setPrompt('consent'); //Set the approval prompt to consent only
$client->setScopes(...);
$client->setAccessType('offline');
$client->setRedirectUri(...);
//Create auth URL for consent
$auth_url = $client->createAuthUrl();
header('Location: ' . filter_var($auth_url, FILTER_SANITIZE_URL));
https://developers.google.com/identity/protocols/oauth2/web-server#creatingclient
Наблюдаемое поведение:
- Пользователь нажимает кнопку Войти с помощью Google
- Пользователь нажимает на учетную запись, и предоставляется JWT
- Пользователь перенаправляется на экран согласия
- Пользователь должен снова выбрать учетную запись <— Нежелательное поведение
- Пользователь соглашается с согласием
- Пользователь перенаправляется на обратный вызов
Как мне правильно реализовать это согласие OAuth2, чтобы мне не приходилось просить пользователя выбирать свою учетную запись 2 раза?
Комментарии:
1. $client-> setPrompt(‘согласие’); <— заставляет пользователя входить в систему каждый раз.
2. Похоже, что я неправильно интерпретирую $client-> setPrompt(‘согласие’), поэтому спасибо за подсказку, однако, какую бы настройку я ни попробовал, я не могу избавиться от 2-го выбора учетной записи пользователя (шаг 4 в разделе «наблюдаемое поведение»)
Ответ №1:
По-видимому, документы неверны. Описание для login_hint:
Если ваше приложение знает, какой пользователь пытается пройти аутентификацию, оно может использовать этот параметр для предоставления подсказки серверу аутентификации Google. Сервер использует подсказку для упрощения процесса входа в систему либо путем предварительного заполнения поля электронной почты в форме входа, либо путем выбора соответствующего сеанса множественного входа.
Установите значение параметра в адрес электронной почты или вспомогательный идентификатор, который эквивалентен идентификатору пользователя Google ID.
В соответствии с этим утверждением идентификатор пользователя (полученный из JWT с помощью $payload[‘sub’]) может быть передан в качестве аргумента, но это, похоже, не работает.
При изменении этого на фактический адрес электронной почты (полученный из JWT с помощью $payload[’email’]) он работает, и второй экран выбора учетной записи (шаг 4 в наблюдаемом поведении) пропускается.