Вход в пользовательское веб-приложение с учетной записью G-Suite - PullRequest
0 голосов
/ 22 февраля 2019

90% моего веб-приложения Google Apps Script / HTMLService доступно анонимным пользователям, однако для доступа к оставшимся 10% необходимо войти в систему с помощью учетной записи G-Suite.

Желаемое поведение заключается в том, что если пользователь уже вошел в G-Suite (например, прочитал Gmail из этого браузера), веб-приложение распознает пользователя, не предлагая войти снова - как если бы вы просто заходили в Календарь Google.после прочтения Gmail.Если пользователь еще не вошел в систему - ему нужно будет войти в систему, используя учетную запись @ my_g-suite.com при доступе к ограниченным функциям.

Моя первая попытка состояла из двух приложений: один был опубликован как «доступен».любому, в том числе анонимному »и другому« доступному членам my_g-suite.com ».Проблема с этим подходом состоит в том, что второе приложение показывает экран входа в систему только в том случае, если в браузере нет идентификатора Google.Если пользователь вошел в обычную почту g-suite, вместо приглашения войти в систему отображается странная ошибка драйвера Google.Я отправил вопрос об этом некоторое время назад, решение не найдено.

Поэтому вместо этого я реализовал кнопку входа, используя это руководство .Поведение, которое я вижу, не соответствует ожиданиям:

  1. Если пользователь уже выполнил вход в систему с UserOne@my_g-suite.com до доступа к приложению (например, посмотрел на G-Подключение учетной записи электронной почты), Session.getActiveUser() на стороне сервера возвращает правильный идентификатор пользователя, однако googleUser.getBasicProfile().getEmail() на клиенте не имеет ничего.
  2. Если пользователь не выполнил вход с использованием идентификатора G-Suite до доступа к приложению изатем выполняет вход с помощью кнопки «Вход» в веб-приложении, однако googleUser.getBasicProfile().getEmail() возвращает правильный идентификатор пользователя), Session.getActiveUser() на стороне сервера ничего не возвращает.
  3. Если пользователь выполняет вход с использованием кнопки как UserTwo@my_g-suite.com, никакое другое приложение G-Suite не распознает его.Поэтому, если пользователь затем входит в UserOne@my_g-suite.com и возвращается в приложение, Session.getActiveUser() говорит, что это UserOne@my_g-suite.com и googleUser.getBasicProfile().getEmail() говоритэто UserTwo@my_g-suite.com.Две конфликтующие идентичности одновременно.

Как сделать так, чтобы вход в мое приложение было 1) единообразным с другими сервисами G-Suite, а не с полностью отдельной, только для приложения 2-й личностью и 2) ограниченным@my_g-suite.com?


Следуя совету @TheMaster, я попробовал это:

  1. Создан сайт сайта Google Сайтов ".my_g-suite.com ", который доступен только для пользователей g-suite и имеет одну страницу с надписью" Вы вошли в g-suite "

  2. В моем веб-приложении, которое запускаетсятак как «я» и «доступно каждому, даже анонимному», я проверил, является ли Session.getActiveUser() пользователем g-suite.Если нет, я делаю window.open("https://login.my_g-suite.com"), который открывает экран входа в новую вкладку, как и ожидалось.

  3. После входа пользователя я перезагружаю веб-приложение.И вот грустная часть:

    • Если браузер не использовался для учетной записи не из G-Suite (как обычная Gmail) - все работает отлично.Session.getActiveUser() показывает вновь зарегистрированный идентификатор пользователя
    • НО, если этот браузер вошел в учетную запись не-G-Suite, Session.getActiveUser() не имеет представления о том, что я только что вошел в G-Suite в другомвкладка (даже после перезагрузки веб-приложения).Вернемся к исходной точке.

Сравнивая это с собственными приложениями Google, это поведение не сильно отличается: например, если вы читаете обычную почту не из g-suite, тогда идитеи войдите на диск Google, используя учетную запись G-Suite, а затем перезагрузите Gmail - это не приведет к автоматическому переходу на G-Suite Gmail только потому, что вы вошли в учетную запись G-Suite в этом браузере.Вам нужно явно указать Gmail, что вы хотите использовать учетную запись G-Suite, вызвав меню выбора активной учетной записи (круглый значок аватара в правом верхнем углу).

Похоже, независимо от того, какой подход я выберу, я сталкиваюсь с одной и той же стеной: необходимость сообщить автономному Google App Script, какая личность Google актуальна.И я не вижу никакого способа сделать это.


То, что я сказалвыше не соответствует действительности из-за недавних изменений Google.(2) теперь приводит к ошибке 404. Вместо экрана входа в систему.

Проблемы со входом, которые несколько дней назад затрагивали только автономные приложения Google App Script, теперь охватывают весь G-Suite.Наша добровольная первичная организация получила G-Suite в основном для безопасного сайта в интрасети (members.my_g-suite.com), где мы обмениваемся внутренними протоколами и документацией.Он построен на новых Сайтах Google и Google Team Drive.До среды попытка доступа к members.my_g-suite.com использовалась для входа на экран входа в G-Suite.Теперь он принимает их до "404. That’s an error. The requested URL / was not found on this server. That’s all we know.".Единственный обходной путь - заставить пользователей выходить из личной Gmail каждый раз перед доступом к G-Suite, что не является разумным требованием для добровольца, использующего персональное устройство.Мы чувствуем, как Google вытащил коврик из-под наших ног.Единственная надежда на то, что это временное изменение, и они вернут его к тому, что было в начале недели.Мы также подтвердили, что это изменение не ограничивается нашим G-Suite.

1 Ответ

0 голосов
/ 22 февраля 2019

Это потому, что ваше веб-приложение работает внутри iframe.Вы можете принудительно войти, отказав в доступе к веб-приложению вручную.

  • onload, проверьте Session.getActiveUser().getEmail() на стороне сервера и посмотрите, соответствует ли оно вашему домену,

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

Вы также можете

  • Продолжить, чтобы открыть https://admin.google.com (или любой URL, относящийся к вашему домену) в другой вкладке
  • Проверьте, открыт ли он, и используйте setInterval, чтобы проверить другое свойство window.close.После закрытия перезагрузите веб-приложение.
...