Введение
В текущий момент в разработке прослеживается общая тенденция упрощения механизмов авторизации и отказ от длинных регистрационных форм с большим количеством вопросов. Стандартной практикой является добавление возможности зарегистрироваться с помощью уже существующих профилей в социальных сетях. Это позволяет упростить процесс регистрации всего до пары кликов.
Внедрение механизма авторизации через соцсети, помимо улучшения пользовательского опыта, позволяет разработчикам сервисов получить доступ к уже существующим данным пользователей и обеспечить защиту от авторегистраций, накруток и других действий потенциальных злоумышленников.
Современные приложения используют стандарт OAuth 2.0, позволяющий получить ограниченный доступ к ресурсам соцсетей с помощью технологий Web. В данной статье изложены сведения о внедрении данного механизма в Desktop приложение Qt с применением службы Firebase Authentication и C++ SDK.
Пользовательский опыт регистрации через социальную сеть
С продуктовой точки зрения, пользовательский опыт можно описать следующим образом. На экране входа (рисунок 1), помимо полей ввода имени и пароля, также содержится набор кнопок с пиктограммами социальных сетей.
При нажатии на кнопку происходит открытие системного браузера и переход на специальную страницу авторизации в выбранной социальной сети (рисунок 2). На экране отображается информация об учетной записи пользователя и данных, доступ к которым будет предоставлен приложению. От пользователя требуется подтвердить предоставление доступа нажатием на соответствующую кнопку.
OAuth 2.0
Спецификация OAuth 2.0 определяет протокол делегирования, который предоставляет клиентам безопасный доступ к ресурсам пользователя на сервисе-провайдере. Такой подход избавляет пользователя от необходимости вводить пароль за пределами сервиса-провайдера: весь процесс сводится к нажатию кнопки «Согласен предоставить доступ к ...». Идея в том, что имея один хорошо защищенный аккаунт, пользователь может использовать его для аутентификации на других сервисах, не раскрывая при этом своего пароля.
Общая схема взаимодействия (рисунок 3) предусматривает следующие шаги:
- Клиент запрашивает авторизацию у владельца ресурса.
- Клиент получает грант авторизации.
- Клиент запрашивает токен доступа путем аутентификации с помощью сервера авторизации и предоставление гранта авторизации.
- Сервер авторизации аутентифицирует клиента, проверяя грант авторизации и, если он действителен, выдает токен доступа (access token) и рефреш токен (refresh token).
- Клиент запрашивает защищенный ресурс у провайдера и аутентифицируется, предоставляя токен доступа.
- Провайдер проверяет токен доступа и, если он действителен, обслуживает запрос.
Firebase Authentication
Аутентификация Firebase - это функция аутентификации пользователей, предоставляемая Firebase в качестве ее серверных служб. Это система аутентификации на основе токенов, которая обеспечивает легкую интеграцию с большинством платформ.
Firebase предоставляет бэкенд, простой в использовании SDK и готовые библиотеки пользовательского интерфейса для реализации аутентификации пользователей в приложении. Он поддерживает аутентификацию как с помощью email и пароля, так и с помощью таких популярных поставщиков идентификации, как Google, Facebook, Twitter и GitHub. Доступна версия C++ SDK c поддержкой Desktop платформ Windows и Mac OS.
Конфигурация OAuth 2.0 в Google Cloud Platform
Конфигурация осуществляется в консоли, доступной по адресу https://console.cloud.google.com/apis/dashboard и включает следующие шаги:
- Создать новый или выбрать существующий проект.
- На вкладке Credentials создать Web client id.
- Установить Redirect URI http://127.0.0.1:8080/
- Скачать файл конфигурации json.
Конфигурация Firebase Authentication
Конфигурация осуществляется в консоли, доступной по адресу https://console.firebase.google.com/ и включает следующие шаги:
- Создать новый или выбрать существующий Android проект.
- На вкладке Authentication – Sign In method добавить необходимые провайдеры, в том числе Google.
- Перейти в Project Settings и скачать google-services.json
Поддержка OAuth 2.0 в Qt
Qt предоставляет модуль Qt Network Authorization, который обеспечивает поддержку OAuth 2.0. С помощью удобного API можно получить Access Token.
Авторизация (рисунок 4) включает в себя следующие шаги:
- Парсинг JSON файла конфигурации, полученного из консоли Google cloud platform.
- Создание экземпляра QOAuth2AuthorizationCodeFlow и привязка его сигнала authorizeWithBrowser к QDesktopServices::openUrl.
- Настройка параметров QOAuth2AuthorizationCodeFlow значениями из файла конфигурации.
- Создание экземпляра QOAuthHttpServerReplyHandler для обработки ответа авторизации.
- Привязка к сигналу QOAuth2AuthorizationCodeFlow::granted для обработчики полученного токена.
Firebase C++ SDK
Firebase C++ SDK предоставляет API аутентификации пользователей, доступа к информации из аккаунтов социальных сетей и получения Firebase Access Token, необходимого для передачи на бэкенд приложения, при наличии такового.
Работа с SDK (рисунок 5) включает следующие шаги:
- Создание экземпляра firebase::App.
- Создание firebase::Auth.
- Создание firebase::Credential с помощью токена id_token, полученного через OAuth 2.0.
- Вызов firebase::Auth::SignInWithCredential.
- Обработка результата запроса, содержащего токен и сведения об аккаунте в социальной сети, такие как аватар, имя и почтовый адрес пользователя.
Вывод
Текущий уровень развития средств разработки и библиотек обеспечивает возможность внедрения современных способов авторизации в Desktop приложения.
Описанный подход позволяет улучшить пользовательский опыт благодаря отказу от Web View и использованию нативных экранных форм окна входа. Другим важным преимуществом является снижение риска возникновения интеграционных ошибок, так как применяется более простая схема с меньшим количеством программных модулей и команд, вовлеченных в разработку продуктового функционала.