Современные стандарты авторизации в Desktop приложениях

Введение

В текущий момент в разработке прослеживается общая тенденция упрощения механизмов авторизации и отказ от длинных регистрационных форм с большим количеством вопросов. Стандартной практикой является добавление возможности зарегистрироваться с помощью уже существующих профилей в социальных сетях. Это позволяет упростить процесс регистрации всего до пары кликов.

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

Современные приложения используют стандарт OAuth 2.0, позволяющий получить ограниченный доступ к ресурсам соцсетей с помощью технологий Web. В данной статье изложены сведения о внедрении данного механизма в Desktop приложение Qt с применением службы Firebase Authentication и C++ SDK.

Пользовательский опыт регистрации через социальную сеть

С продуктовой точки зрения, пользовательский опыт можно описать следующим образом. На экране входа (рисунок 1), помимо полей ввода имени и пароля, также содержится набор кнопок с пиктограммами социальных сетей.

Рисунок 1 - экран входа в приложение

При нажатии на кнопку происходит открытие системного браузера и переход на специальную страницу авторизации в выбранной социальной сети (рисунок 2). На экране отображается информация об учетной записи пользователя и данных, доступ к которым будет предоставлен приложению. От пользователя требуется подтвердить предоставление доступа нажатием на соответствующую кнопку.

Рисунок 2 - предоставление доступа к Google аккаунту в браузере

OAuth 2.0

Спецификация OAuth 2.0 определяет протокол делегирования, который предоставляет клиентам безопасный доступ к ресурсам пользователя на сервисе-провайдере. Такой подход избавляет пользователя от необходимости вводить пароль за пределами сервиса-провайдера: весь процесс сводится к нажатию кнопки «Согласен предоставить доступ к ...». Идея в том, что имея один хорошо защищенный аккаунт, пользователь может использовать его для аутентификации на других сервисах, не раскрывая при этом своего пароля.

Рисунок 3 - общая схема OAuth 2.0

Общая схема взаимодействия (рисунок 3) предусматривает следующие шаги:

  1. Клиент запрашивает авторизацию у владельца ресурса.
  2. Клиент получает грант авторизации.
  3. Клиент запрашивает токен доступа путем аутентификации с помощью сервера авторизации и предоставление гранта авторизации.
  4. Сервер авторизации аутентифицирует клиента, проверяя грант авторизации и, если он действителен, выдает токен доступа (access token) и рефреш токен (refresh token).
  5. Клиент запрашивает защищенный ресурс у провайдера и аутентифицируется, предоставляя токен доступа.
  6. Провайдер проверяет токен доступа и, если он действителен, обслуживает запрос.

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 и включает следующие шаги:

  1. Создать новый или выбрать существующий проект.
  2. На вкладке Credentials создать Web client id.
  3. Установить Redirect URI http://127.0.0.1:8080/
  4. Скачать файл конфигурации json.

Конфигурация Firebase Authentication

Конфигурация осуществляется в консоли, доступной по адресу https://console.firebase.google.com/ и включает следующие шаги:

  1. Создать новый или выбрать существующий Android проект.
  2. На вкладке Authentication – Sign In method добавить необходимые провайдеры, в том числе Google.
  3. Перейти в Project Settings и скачать google-services.json

Поддержка OAuth 2.0 в Qt

Qt предоставляет модуль Qt Network Authorization, который обеспечивает поддержку OAuth 2.0. С помощью удобного API можно получить Access Token.

Рисунок 4 - листинг работы с Qt Network Authorization

Авторизация (рисунок 4) включает в себя следующие шаги:

  1. Парсинг JSON файла конфигурации, полученного из консоли Google cloud platform.
  2. Создание экземпляра QOAuth2AuthorizationCodeFlow и привязка его сигнала authorizeWithBrowser к QDesktopServices::openUrl.
  3. Настройка параметров QOAuth2AuthorizationCodeFlow значениями из файла конфигурации.
  4. Создание экземпляра QOAuthHttpServerReplyHandler для обработки ответа авторизации.
  5. Привязка к сигналу QOAuth2AuthorizationCodeFlow::granted для обработчики полученного токена.

Firebase C++ SDK

Firebase C++ SDK предоставляет API аутентификации пользователей, доступа к информации из аккаунтов социальных сетей и получения Firebase Access Token, необходимого для передачи на бэкенд приложения, при наличии такового.

Рисунок 5 - листинг Firebase Google authentication

Работа с SDK (рисунок 5) включает следующие шаги:

  1. Создание экземпляра firebase::App.
  2. Создание firebase::Auth.
  3. Создание firebase::Credential с помощью токена id_token, полученного через OAuth 2.0.
  4. Вызов firebase::Auth::SignInWithCredential.
  5. Обработка результата запроса, содержащего токен и сведения об аккаунте в социальной сети, такие как аватар, имя и почтовый адрес пользователя.

Вывод

Текущий уровень развития средств разработки и библиотек обеспечивает возможность внедрения современных способов авторизации в Desktop приложения.

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