Будем реализовывать единый вход Google OAuth для веб-сайта. Библиотека google-api-client устарела (о чем упоминается в Google Identity Document). Правда, есть еще одна подходящая для использования библиотека под названием google-api-ruby-client, но в этой статье будет рассматриваться только конструирование чистых HTTP/HTTPS-запросов.
Этап 1: настройка учетных данных Google
- Входим в Google API Console.
- Настраиваем страницу соглашения OAuth. Ничего особенного указывать не нужно, за исключением установки типа пользователя на External Usage (внешнее использование). Другие параметры просто оставляем по умолчанию.

3. Создаем идентификатор клиента OAuth (когда нужны разные ключи для разных сред, устанавливаем два или три для тестовой и эксплуатационной среды). В качестве типа приложения указываем Web application (веб-приложение), здесь же вводим название приложения и URI обратного вызова перенаправления.

4. Сохраняем Client ID (идентификатор клиента) и Client Secret (секрет клиента) для дальнейшего использования на следующих этапах.

Этап 2: получение краткосрочного кода авторизации
- См. документы: 1 и 2.
- Путь URL-адреса для получения кода: https://accounts.google.com/o/oauth2/v2/auth.
- Для проверки запроса используем Postman. Задействуем метод
GET
, как в приведенном ниже примере (скопированном из указанного документа). Обязательные параметры:client_id
,response_type=code
,scope=openid%20profile%20email
,redirect_uri
.

4. Другие параметры, использованные в примере: access_type=offline
, include_granted_scopes=true
.
5. Не забываем указать URI обратного вызова в параметре redirect_uri
.
Этап 3: получение долгосрочного токена
- См. документы 1 и 2 (но маркер обновления не использован).
- Путь URL-адреса для получения токена: https://oauth2.googleapis.com/token.
- Задействуем метод
POST
и в качестве типа указываемx-www-url-encoded
. Обязательные параметры:code
,client_id
,client_secret
,redirect_uri
,grant_type=authorization_code
.

4. Не забываем, что redirect_uri
должен совпадать с путем redirect_uri
, указанным в этапе 2.
Этап 4: получение электронной почты и профилей пользователей
- По окончании этапа 3 получаем несколько токенов. Следуя изложенному в этом документе, используем
id_token
. - Для проверки
id_token
задействуем библиотеку Rubygoogle-id-token
(отправляемid_token
из веб-приложения [сторона браузера] и проверяемid_token
на стороне веб-Api [сторона сервера api]). - Напоминание: слово
aud
в библиотекеgoogle-id-token
означаетGOOGLE_CLIENT_ID
, поэтому отправляем из веб-приложения в веб-api в качестве параметра также иGOOGLE_CLIENT_ID
. Не забываем сохранять идентификатор клиента Client ID в качестве переменной среды и на стороне Api, и на стороне приложения.
Этап 5: благополучно авторизуемся в своей учетной записи Google!
Рекомендации по использованию библиотекиRuby httprb/http:
Когда нужно указать в качестве типа HTTP-запроса с задействованием метода post
тип x-www-url-encoded
, лучше использовать функцию HTTP::URI.form_encode
для изменения хеша Ruby на строку. В этом случае строка будет «съедена» методом post
(а тип станет body
).Вот пример:

Читайте также:
- Магия Pry для отладки кода Ruby
- Структура типизации в Ruby 3
- Создаем функции поиска и фильтрации в Ruby on Rails
Читайте нас в Telegram, VK и Яндекс.Дзен
Перевод статьи 夜絳紅: Google OAuth for Ruby implementation