Вебинары

Авторизация с помощью Google Sign In

Задача урока: успешная авторизация пользователя через google аккаунт.

Условия выполнения: отображение информации из профиля + токен юзера.

Видео-версия

Подготовка

Для авторизации потребуется «приложение» google и проект на localhost (create-react-app подходит без проблем).

Откройте https://console.developers.google.com/apis/ и примите условия использования.

Создайте новый проект:

После создания ваш проект будет выбран автоматически (если он единственный). Пройдите в раздел Credentials.

Далее нужно создать OAuth client ID, выбрать тип приложения Web Application и добавить разрешенный домен, с которого вы будете выполнять запросы. Инструкция в картинках ниже.

В конечном счете, у вас будет ключ (client ID):

XXX.apps.googleusercontent.com

Разработка

План:

  • развернуть create-react-app (в статье не обсуждается);
  • добавить скрипт google api;
  • разобраться с документацией;
  • залогинить пользователя.

После успешного запуска create-react-app второй версии, в браузере можно увидеть следующее:

Создайте в корне файл .env , в котором будет храниться ваш CLIENT_ID ключ, добавьте этот файл в .gitignore, если планируете использовать git.

.env

Все, что начинается с REACT_APP_ в cra будет доступно через process.env, например: process.env.REACT_APP_GOOGLE_CLIENT_ID вернет ваш ключ из «секретного» файла. Подробнее в статье (англ).

Добавьте на главную страницу в head скрипт от google.

public/index.html

<script src="https://apis.google.com/js/platform.js" async defer></script>

Теперь взглянем в документацию, в раздел Home (не торопитесь добавлять все, что выделено)

Как видите, помимо скрипта в примере присутствуют и другие «инструкции» для корректной работы. Но проблема в том, что такое поведение не подойдет для react-приложения. Поэтому, мы добавляем только скрипт, а все остальное будем делать с помощью методов API, которые описаны на вкладке Reference.

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

Добавляем авторизацию через google в сreate-react-app

Остался последний пункт плана — «залогинить пользователя». Для этого, разобьем его на шаги:

  • инициализировать модуль gapi.auth2;
  • добавить функцию-обработчик на логин и на логаут;
  • вывести информацию о пользователе после успешного логина в консоль;
  • [бонус] оформить информацию на странице приложения, добавить красоты.

Для выполнения пунктов, нам понадобятся следующие методы:

  • gapi.auth2.init(params) — для инициализации (будем использовать в componentDidMount). Понадобится ваш ключ (client ID)
  • gapi.auth2.getAuthInstance() — чтобы получить объект GoogleAuth, который умеет:
    • GoogleAuth.signIn() — проивзодить логин
    • GoogleAuth.signOut() — производить логаут

Все методы взяты из документации, где вы можете ознакомиться и с другими полезными функциями.

Удалим лишнее из компонента <App /> и добавим необходимое:

(внимание, крутящееся лого реакта может перекрывать ваши элементы, и они будут не кликабельны)

src/App.js

Проверим, что в консоли:

По клику на Log in появится всплывающее окно

После выбора профиля — в консоль «упадет» информация из профиля


Комментарии по коду для «совсем новичков»: после добавления скрипта от google, у нас появился глобальный объект gapi, который лучше вызывать как window.gapi, чтобы программист, который читает ваш код не искал где объявлена переменная gapi.

Далее в cdm и в обработчиках signIn/signOut используется стандартный подход, когда в promise возвращается либо информация об объекте в случае успеха, либо ошибка.


Воспользуемся state и «подкрутим» пример:

src/App.js

src/User.js

Результат:


Итоги

Мы научились использовать механизм входа «через google». В данный момент у нас есть возможность вытащить token, с помощью которого можно выполнять запросы к Google API. Также токен можно передавать на свой бэкэнд и там его «расшифровать». Это рекомендуемый способ, так как передавать ID пользователя или прочую информацию — небезопасно.

Исходный код

Макс

View Comments

  • Добрый день. А как сделать так, чтоб при обновлении страницы, не нужно было заново авторизовываться?

    • Добрый день, можно сохранить полученый токен в localStorage. Почитать про localStorage можно здесь. Главное не забыть, что токен может "протухнуть" (то есть, перестать быть валидным, например, если юзер нажал "выйти со всех устройств" в недрах настроек своего аккаунта, или что-то подобное).

  • Добрый день, урок классный, только настройки на самом гугле немного обновились

    • Спасибо за отзыв. Возможно, стоит выключить adblock или другое подобное расширение (которое блокирует рекламу, или куки)

  • а access token можно передавать на свой бэкэнд и со своего бекэнда делать запросы к google API? Просто tokenId не несет информации о access token

Recent Posts

Elm #2: Загрузка и отображение json

Сегодня будем использовать parcel и IntelliJ IDEA Community Edition. Все инструменты бесплатные. Инициализация elm проекта…

4 года ago

Elm для React/Redux разработчиков (Elm #1: Знакомимся с Elm)

На данном вебинаре мы знакомились с языком Elm проводя параллели между Elm и Redux, поэтому…

4 года ago

Масштабируем Elm-приложение (конспект)

Richard Feldman рассказывает как масштабировать Elm приложение без боли. Показаны техники: extended records, подход narrow…

4 года ago

Elm видео, за ноябрь 2019

В данной заметке вы найдете конспект видео по Elm, которые я посмотрел в ноябре 2019.…

4 года ago

Итоги 2019. Что учить фронтендеру в 2020?

Итоги года 2019 // Max Frontend Покажи мне свой гитхаб, и я скажу работал ли…

4 года ago

Почему мне стоит изучать Elm?

Почему стоит изучать Elm? Потому что это интересный вызов, редкие (но вкусные) вакансии и хороший…

4 года ago