Создайте новое приложение React и добавьте состояние входа

Фото автора.

Я вхожу в свою учетную запись Google везде, где могу, чтобы не иметь еще один пароль на другом случайном веб-сайте. Я видел улучшенный интерфейс на некоторых сайтах (может быть, я только сейчас заметил это), таких как Trello/Medium, где вы можете войти в систему с помощью Google одним щелчком мыши на странице без перенаправления. Оказывается, это называется One Tap for Web — вариант входа без пароля от Google — и вы можете использовать его на своем собственном веб-сайте.

Я взял его на пробу и настроил на примере Hello World React. Вот что я нашел, бородавки и все такое.

Начните с простого приложения React:

Добавить глобальный индекс

В этом примере приложения я буду использовать библиотеку JS для инициализации приглашения одним касанием. В справочном руководстве показано, как добавить его «используя в основном HTML», но если вы используете интерфейсный фреймворк, для его настройки проще использовать только JS.

npx create-react-app one-tap-demo

Добавьте некоторое состояние, чтобы отслеживать, когда пользователь вошел в систему:

Добавьте библиотеку Google Sign-In (также называемую GSI) динамически при запуске приложения:

Получите идентификатор клиента из консоли разработчика Google

Есть два вызова API: один для настройки библиотеки и один для отображения приглашения пользователю (после настройки библиотеки). Чтобы увидеть все возможные варианты конфигурации, «проверьте ссылку».

Я добавил последний как хук useEffect с [] в качестве аргумента, чтобы он запускался только один раз после первого рендеринга (см. ссылку).

Когда вы обновите страницу, если вы все сделали правильно в первый раз, вы увидите подсказку.

Следуйте этому руководству, чтобы добавить свой «Идентификатор клиента Google API».

Использование кнопки входа

Когда я обновил страницу после выполнения шагов и добавления своего идентификатора клиента в приложение, я получил это сообщение об ошибке:

Для меня это означало, что мой идентификатор клиента Google OAuth был неправильно настроен. Я пропустил «Ключевой момент» в официальном пошаговом руководстве, которое применимо только в том случае, если мы используем localhost в качестве нашего домена.

[GSI] Origin is not an authorized javascript origin

Теперь, когда вы обновляете страницу, она должна работать, и вы должны увидеть подсказку. Если вы не видите подсказку, проверьте консоль разработчика на наличие ошибок. А если это не поможет, смотрите раздел об отладке ниже.

  • Вам также необходимо добавить http://localhost в качестве авторизованного источника JavaScript. Это кажется необходимым только в разработке, когда вы можете использовать другой порт в своем URL-адресе (мы).
  • Вы не можете очистить файлы cookie или использовать окно инкогнито, чтобы обойти это (по крайней мере, я не мог). Кажется, это зависит от вашего браузера и веб-сайта (может быть, IP?). Не ясно. Если вы случайно столкнулись с этим, пришло время сделать перерыв или попробовать другой URL-адрес браузера/веб-сайта.

Предупреждение №1

Если вы делаете это впервые, не нажимайте кнопку X в подсказке, пока не прочитаете это предупреждение!

Нажатие кнопки X в подсказке одним касанием отклоняет подсказку. Если вы обновите страницу после этого, вы не увидите, что кнопка вернулась. Почему?

Предупреждение №2

Библиотека One Tap имеет некоторые дополнительные побочные эффекты, связанные с отклонением подсказки. Если вы нажали кнопку X, в ваш домен был добавлен файл cookie с именем g_state. Вот скриншот того, где вы можете найти это. Если вы очистите это значение файла cookie, вы увидите приглашение вернуться.

Нажав кнопку X более одного раза, вы перейдете в режим экспоненциального охлаждения («см. ссылку»). Что это обозначает?

Отладка проблем с помощью входа в систему одним касанием

Руководство разработчика предлагает это в качестве примера кода для вашей подсказки. Но он упускает из виду важную деталь: причина, по которой ваша подсказка не отображалась, была пропущена или отклонена, также находится в объекте notification:

  • После того, как я удалил его, я не мог его увидеть в течение 10–15 минут, хотя таблица в руководстве для разработчиков предполагает, что я не увижу его в течение двух часов. В любом случае, это раздражающая вещь, с которой приходится сталкиваться во время разработки.
  • Ваш пользователь «отказался» от приглашения, отклонив его. Вы можете попробовать очистить файл cookie g_state, который может находиться в вашем домене, если вы случайно удалили его.

Теперь, когда ваш пользователь вошел в систему

Есть три типа «моментов» уведомлений: display, skipped и dismissed, и у каждого свой список возможных причин со своим API-вызовом для их выяснения («см. полный список»). Если у вас возникли проблемы с кнопкой, и вы не знаете, почему, может быть полезно использовать приведенный ниже фрагмент кода, чтобы увидеть, как выглядят эти причины:

Одна из причин, которую вы можете увидеть, это opt_out_or_no_session. Это может означать, что:

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

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

После того, как вы выбрали свою учетную запись и вошли без ошибок, пришло время подключить ее к вашему приложению React. Если вы уже использовали библиотеку Google Sign-In для веб-сайтов («см. мое руководство по ее настройке»), есть API, который позволит вам получить информацию о пользователе. Но с библиотекой One Tap Sign-In for Web вы получаете только токен идентификатора пользователя (он же токен JWT).

Выписка

Это означает, что вам нужно декодировать токен ID, чтобы получить информацию о пользователе. Мы можем сделать это, добавив библиотеку jwt-decode с npm install --save jwt-decode.

Чтобы сделать все это, добавьте обратный вызов в блок инициализации:

Чтобы увидеть всю доступную вам информацию о пользователе, «см. руководство разработчика».

Документы предлагают добавить <div id="g_id_signout"></div> на вашу страницу, но неясно, должна ли библиотека создавать для вас кнопку выхода. Я думаю, что ответ отрицательный, потому что я пробовал, и ничего не происходит.

Ограничения кнопки входа в систему одним касанием

Моя текущая теория заключается в том, что выход должен быть предоставлен вашему собственному приложению и может быть таким же простым, как обновление страницы.

Она выделена на главной странице документации для разработчиков, но вы не можете использовать эту библиотеку отдельно. Я сделал это здесь для примера «привет, мир», но это должно было улучшить ваш опыт входа в систему.

  • Если бы я хотел интегрировать это с существующей системой входа в систему, «выход» означал бы выход из моего собственного приложения (а не из моей учетной записи Google).
  • Этот процесс работает до тех пор, пока вы не включите опцию автоматического входа.
  • Кнопка «Вход одним нажатием» работает только в Chrome и Firefox на Android, iOS, macOS, Linux и Windows 10. Если у вас есть пользователи в Safari или Edge, они не увидят подсказку. Когда я пытаюсь это сделать, я получаю сообщение об ошибке «Не отображается» с opt_out_or_no_session в качестве причины.

Убедитесь, что URL-адрес вашего сайта (например, http://localhost:3000) добавлен как авторизованный источник JavaScript и как допустимый URI перенаправления в клиентской консоли Google OAuth.

  • Если ваши пользователи случайно отклонят приглашение (см. предупреждение выше, если вы пропустили его в первый раз), они также увидят opt_out_or_no_session в качестве причины «Не отображается» и не смогут войти в систему.
  • Библиотека (и сам интерфейс) отличается от библиотеки Google Sign-In for Web. Библиотека One Tap использует google.accounts.id.initialize() для инициализации приложения, а другая — gapi.auth2.init(). Это похоже на упущенную возможность поместить обе системы входа в систему за одним и тем же интерфейсом.
  • Нет кнопки выхода. Фрагмент, упомянутый в документах, похоже, ничего не делает. Я предполагаю, что кнопка выхода может означать обновление страницы, что вызовет повторное появление подсказки, что фактически приведет к выходу из системы.
  • «http://narrabri.net/fub/Sch-v-Fre-dfb-01.html»
    «http://narrabri.net/fub/Sch-v-Fre-dfb-02.html»
    «http://narrabri.net/fub/Sch-v-Fre-dfb-03.html»
    «http://narrabri.net/fub/Sch-v-Fre-dfb- 04.html»
    «http://narrabri.net/fub/Sch-v-Fre-dfb-05.html»
    «http://narrabri.net/fub/Juv-v- Ata-notizie-01.html»
    «http://narrabri.net/fub/Juv-v-Ata-notizie-02.html»
    «http://narrabri.net/fub/ Juv-v-Ata-notizie-03.html»
    «http://narrabri.net/fub/Juv-v-Ata-notizie-04.html»
    «http://narrabri. net/fub/Juv-v-Ata-notizie-05.html»
    «http://narrabri.net/fub/v-ideo-Nantes-foot-fr-01.html»
    « http://narrabri.net/fub/v-ideo-Nantes-foot-fr-02.html»
    «http://narrabri.net/fub/v-ideo-Nantes-foot-fr-03 .html»
    «http://narrabri.net/fub/Nm-v-Nc-direct-tv-01.html»
    «http://narrabri.net/fub/Nm-v -Nc-direct-tv-02.html»
    «http://narrabri.net/fub/Nm-v-Nc-direct-tv-03.html»
    «http://narrabri .net/fub/Mon-v-Met-sncf-01.html»
    «http://narrabri.net/fub/ Mon-v-Met-sncf-02.html»
    «http://narrabri.net/fub/Mon-v-Met-sncf-03.html»
    «http://narrabri. net/fub/Dijon-v-Lille-chaine-tv1.html»
    «http://narrabri.net/fub/Dijon-v-Lille-chaine-tv2.html»
    «http: //narrabri.net/fub/Дижон-в-Лилль-чейн-tv3.html»
    «http://narrabri.net/fub/Ang-v-Stb-foot-fr-01.html»< br /> «http://narrabri.net/fub/Ang-v-Stb-foot-fr-02.html»
    «http://narrabri.net/fub/Ang-v-Stb-foot -fr-03.html»
    «https://aicbelize.azurewebsites.net/fcb/Sch-v-Fre-dfb-01.html»
    «https://aicbelize.azurewebsites.net /fcb/Sch-v-Fre-dfb-02.html»
    «https://aicbelize.azurewebsites.net/fcb/Sch-v-Fre-dfb-03.html»
    «https ://aicbelize.azurewebsites.net/fcb/Sch-v-Fre-dfb-04.html»
    «https://aicbelize.azurewebsites.net/fcb/Sch-v-Fre-dfb-05. html»
    «https://aicbelize.azurewebsites.net/fcb/Juv-v-Ata-notizie-01.html»
    «https://aicbelize.azurewebsites.net/fcb/Juv- v-Ata-notizie-02.html»
    «https://aicbelize.azurewebsites.net/fcb/Juv-v-Ata-notizi e-03.html»
    «https://aicbelize.azurewebsites.net/fcb/Juv-v-Ata-notizie-04.html»
    «https://aicbelize.azurewebsites.net/ fcb/Juv-v-Ata-notizie-05.html»
    «https://aicbelize.azurewebsites.net/fcb/v-ideo-Nantes-foot-fr-01.html»
    « https://aicbelize.azurewebsites.net/fcb/v-ideo-Nantes-foot-fr-02.html»
    «https://aicbelize.azurewebsites.net/fcb/v-ideo-Nantes-foot -fr-03.html»
    «https://aicbelize.azurewebsites.net/fcb/Nm-v-Nc-direct-tv-01.html»
    «https://aicbelize.azurewebsites .net/fcb/Nm-v-Nc-direct-tv-02.html»
    «https://aicbelize.azurewebsites.net/fcb/Nm-v-Nc-direct-tv-03.html»
    «https://aicbelize.azurewebsites.net/fcb/Mon-v-Met-sncf-01.html»
    «https://aicbelize.azurewebsites.net/fcb/Mon-v- Met-sncf-02.html»
    «https://aicbelize.azurewebsites.net/fcb/Mon-v-Met-sncf-03.html»
    «https://aicbelize.azurewebsites. net/fcb/Дижон-в-Лилль-чейн-tv1.html»
    «https://aicbelize.azurewebsites.net/fcb/Дижон-в-Лилль-чейн-tv2.html»
    « https://а icbelize.azurewebsites.net/fcb/Dijon-v-Lille-chaine-tv3.html»
    «https://aicbelize.azurewebsites.net/fcb/Ang-v-Stb-foot-fr-01.html »
    «https://aicbelize.azurewebsites.net/fcb/Ang-v-Stb-foot-fr-02.html»
    «https://aicbelize.azurewebsites.net/fcb/Ang -v-Stb-foot-fr-03.html»
    «https://aicbelize.azurewebsites.net/serv0/Video-Schalke-v-Freiburg-hq01.html»
    «https:/ /aicbelize.azurewebsites.net/serv0/Video-Schalke-v-Freiburg-hq02.html»
    «https://aicbelize.azurewebsites.net/serv0/Video-Schalke-v-Freiburg-hq03.html»
    «https://aicbelize.azurewebsites.net/serv0/Epl-Arsenal-v-Southampton-v-en01.html»
    «https://aicbelize.azurewebsites.net/serv0/Epl- Арсенал-v-Саутгемптон-v-en02.html»
    «https://aicbelize.azurewebsites.net/serv0/Epl-Arsenal-v-Саутгемптон-v-en03.html»
    «https: //aicbelize.azurewebsites.net/serv0/videos-Leeds-v-Newcastle-lez-01.html»
    «https://aicbelize.azurewebsites.net/serv0/videos-Leeds-v-Newcastle-lez -02.html»
    «https://aicbeliz e.azurewebsites.net/serv0/videos-Leeds-v-Newcastle-lez-03.html»
    «https://aicbelize.azurewebsites.net/serv0/Video-Leicester-v-Everton-en-gb01 .html»
    «https://aicbelize.azurewebsites.net/serv0/Video-Leicester-v-Everton-en-gb02.html»
    «https://aicbelize.azurewebsites.net/serv0 /Video-Leicester-v-Everton-en-gb03.html»
    «https://aicbelize.azurewebsites.net/serv0/video-Juve-v-Ath-diretta01.html»
    «https ://aicbelize.azurewebsites.net/serv0/video-Juve-v-Ath-diretta02.html»
    «https://aicbelize.azurewebsites.net/serv0/video-Juve-v-Ath-diretta03. html»
    «https://aicbelize.azurewebsites.net/serv0/video-Juve-v-Ath-diretta04.html»
    «https://aicbelize.azurewebsites.net/serv0/video- Juve-v-Ath-diretta05.html»
    «https://aicbelize.azurewebsites.net/serv0/video-County-v-Swansea-City-01.html»
    «https:// aicbelize.azurewebsites.net/serv0/video-County-v-Swansea-City-02.html»
    «https://aicbelize.azurewebsites.net/serv0/video-County-v-Swa

Вход без пароля с помощью Google 1 Tap для Интернета