Подтвердить что ты не робот

Возможно ли иметь возможность правильно выбрать любую доступную учетную запись Google для использования при авторизации через клиентскую библиотеку JS для Диска?

У меня есть существующее приложение с включенным Google Диском, которое использует клиентскую библиотеку Google Java и серверный поток.

Если вы не вошли в приложение и не перешли к URL-адресу, и вы вошли в более чем одну учетную запись google в этом браузере (возможна только одна личная учетная запись Google, любые дополнительные должны быть учетными записями Google). OAuth callback предлагает варианты выбора учетной записи Google для использования.

Однако при тестировании коммутатора на использование клиентской библиотеки JavaScript я не могу активировать экран выбора нескольких учетных записей, используя gapi.auth.authorize. Можно ли обрабатывать несколько учетных записей с помощью библиотеки JS?

Обновление: я попытался с параметром immediate false. Я могу войти в систему, пока я не изменяю учетную запись во всплывающем окне. Если я меняю учетную запись, я получаю:

https://accounts.google.com/o/oauth2/auth?client_id=433863057149.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/drive.file+https://www.googleapis.com/auth/drive.install+https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile&immediate=false&redirect_uri=postmessage&origin=https://drivedrawio.appspot.com&proxy=oauth2relay593063763&response_type=token&state=701344514&authuser=1

на новой вкладке, и ничего не происходит. Я сделал видео, чтобы продемонстрировать.

Обновление 2: Эта ошибка против клиентской библиотеки JS для необходимости двойного выбора учетной записи mulitple была принята.

4b9b3361

Ответ 1

Вы не получаете экран выбора нескольких пользователей из-за следующего параметра: authuser=0 Это автоматически выбирает первую учетную запись, с которой вы выполняете вход (authuser=1 будет выбирать второй и т.д.).

В настоящее время невозможно удалить этот параметр с помощью клиентской библиотеки, потому что клиентская библиотека автоматически устанавливает его в 0 (именно поэтому он утверждает, что не обрабатывает мультисчета), если нет значения, поэтому один из способов - переопределить его -1, например, это покажет выбор с несколькими учетными записями. Затем вы также можете обратиться к профилю пользователя или по электронной почте одновременно с запросом доступа к другим API-интерфейсам и получить либо электронное письмо пользователя, либо его идентификатор. Затем на последующем auth вы можете указать параметр user_id, который будет обходить экран выбора пользователя.

Итак, на практике сначала авторизуйтесь следующим образом:

gapi.auth.authorize({client_id: <Your Client ID>,
                     scope: 'https://www.googleapis.com/auth/drive openid', // That requires access to Google Drive and to the UserInfo API
                     authuser: -1});

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

Хитрость заключается в том, чтобы получить идентификатор пользователя с помощью API UserInfo, сохранить этот идентификатор в cookie сеанса и использовать его при последующем авторизации следующим образом:

gapi.auth.authorize({client_id: <Your Client ID>,
                     scope: 'https://www.googleapis.com/auth/drive openid',
                     user_id: <The User ID>,
                     authuser: -1});

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

Для справки другой параметр URL, влияющий на поток пользователя:

  • user_id: аналогично authuser (обходит экран выбора нескольких учетных записей), но вы можете использовать адрес электронной почты (например, [email protected]) или идентификатор пользователя, полученный из нашей конечной точки Open ID Connect/API Google +/UserInfo API
  • approval_prompt: по умолчанию auto, можно установить значение force, чтобы убедиться, что экран подтверждения/предоставления показан. Это гарантирует, что экран gant не будет обходить при последующем auth (после первого раза).
  • immediate: immediate немного сложнее, если он установлен на true, он обходит экран предоставления (вроде approval_prompt=auto), если пользователь уже предоставил разрешение ранее, но если пользователь не предоставил разрешение ранее вы получите перенаправление с ошибкой: error=immediate_failed. Если установлено значение false, оно не добавит специального поведения и, следовательно, отменит настройку поведения значением approval_prompt.

Примечание: immediate=true и approval_prompt=force являются недопустимой комбинацией.

Я думаю, что клиентская библиотека использует параметр immediate, так что если он получит error=immediate_failed, он перезапустит поток auth без параметра authuser, но это только предположения:)

Ответ 2

Страница доступа к предоставлению доступа OAuth отображается только в том случае, если она не находится в непосредственном режиме, работает ли она так, как ожидалось, если вы установите для параметра immediate значение false?

Ответ 4

Обратите внимание на параметр authuser. Например, установите это значение "2", и вам будет предложено войти в систему, даже если вы уже прошли аутентификацию.