Будем реализовывать единый вход Google OAuth для веб-сайта. Библиотека google-api-client устарела (о чем упоминается в Google Identity Document). Правда, есть еще одна подходящая для использования библиотека под названием google-api-ruby-client, но в этой статье будет рассматриваться только конструирование чистых HTTP/HTTPS-запросов.

Этап 1: настройка учетных данных Google

  1. Входим в Google API Console.
  2. Настраиваем страницу соглашения OAuth. Ничего особенного указывать не нужно, за исключением установки типа пользователя на External Usage (внешнее использование). Другие параметры просто оставляем по умолчанию.
Страница соглашения OAuth

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

Создание клиента OAuth

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

Получение информации об учетных данных клиента

Этап 2: получение краткосрочного кода авторизации

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

https://accounts.google.com/o/oauth2/v2/auth? scope=https%3A//www.googleapis.com/auth/drive.metadata.readonly& access_type=offline& include_granted_scopes=true& response_type=code& state=state_parameter_passthrough_value& redirect_uri=https%3A//oauth2.example.com/code& client_id=client_id

4. Другие параметры, использованные в примере: access_type=offline, include_granted_scopes=true.

5. Не забываем указать URI обратного вызова в параметре redirect_uri.

Этап 3: получение долгосрочного токена

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

4. Не забываем, что redirect_uri должен совпадать с путем redirect_uri, указанным в этапе 2.

Этап 4: получение электронной почты и профилей пользователей

  1. По окончании этапа 3 получаем несколько токенов. Следуя изложенному в этом документе, используем id_token.
  2. Для проверки id_token задействуем библиотеку Ruby google-id-token (отправляем id_token из веб-приложения [сторона браузера] и проверяем id_token на стороне веб-Api [сторона сервера api]).
  3. Напоминание: слово 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).Вот пример:

Использование HTTP для x-www-url-encoded

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи 夜絳紅: Google OAuth for Ruby implementation

Предыдущая статьяКак запустить любое ПО с графическим интерфейсом в Docker?
Следующая статья9 важных сниппетов Python для оптимизации работы со скриптами