Предварительный выбор учетной записи для экрана согласия Google OAuth2, чтобы предотвратить выбор избыточной учетной записи

#php #google-oauth #google-authentication #google-cloud-identity

#php #google-oauth #google-аутентификация #google-cloud-identity

Вопрос:

В моем веб-приложении я хочу реализовать следующий поток

  1. Пользователь нажимает кнопку Войти с помощью Google
  2. Пользователь выбирает учетную запись на экране перенаправления
  3. Я получаю JWT с идентификатором учетной записи и адресом электронной почты
  4. Я установил идентификатор учетной записи в качестве подсказки для входа и установил запрос только для «согласия»
  5. Я создаю URL-адрес авторизации и снова перенаправляю в Google для получения согласия
  6. На следующем экране согласия пользователю нужно будет только подтвердить согласие, а не выбирать свою учетную запись во второй раз
  7. Я обрабатываю обратный вызов с согласия

Согласно документам, я реализовал обратный вызов из «войти с помощью кнопки 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

Наблюдаемое поведение:

  1. Пользователь нажимает кнопку Войти с помощью Google
  2. Пользователь нажимает на учетную запись, и предоставляется JWT
  3. Пользователь перенаправляется на экран согласия
  4. Пользователь должен снова выбрать учетную запись <— Нежелательное поведение
  5. Пользователь соглашается с согласием
  6. Пользователь перенаправляется на обратный вызов

Как мне правильно реализовать это согласие OAuth2, чтобы мне не приходилось просить пользователя выбирать свою учетную запись 2 раза?

Комментарии:

1. $client-> setPrompt(‘согласие’); <— заставляет пользователя входить в систему каждый раз.

2. Похоже, что я неправильно интерпретирую $client-> setPrompt(‘согласие’), поэтому спасибо за подсказку, однако, какую бы настройку я ни попробовал, я не могу избавиться от 2-го выбора учетной записи пользователя (шаг 4 в разделе «наблюдаемое поведение»)

Ответ №1:

По-видимому, документы неверны. Описание для login_hint:

Если ваше приложение знает, какой пользователь пытается пройти аутентификацию, оно может использовать этот параметр для предоставления подсказки серверу аутентификации Google. Сервер использует подсказку для упрощения процесса входа в систему либо путем предварительного заполнения поля электронной почты в форме входа, либо путем выбора соответствующего сеанса множественного входа.

Установите значение параметра в адрес электронной почты или вспомогательный идентификатор, который эквивалентен идентификатору пользователя Google ID.

В соответствии с этим утверждением идентификатор пользователя (полученный из JWT с помощью $payload[‘sub’]) может быть передан в качестве аргумента, но это, похоже, не работает.

При изменении этого на фактический адрес электронной почты (полученный из JWT с помощью $payload[’email’]) он работает, и второй экран выбора учетной записи (шаг 4 в наблюдаемом поведении) пропускается.