Мобильные SDK — Versola Docs
/docs
0.1.0versola.ioGitHub

Мобильные SDK

Versola OAuth SDK для Android, iOS и Flutter: вход через системный браузер, защищенное хранение сессии, обновление токенов и типизированные ошибки, с установкой для каждой платформы.

Versola OAuth SDK проводит вход через системный браузер, хранит сессию в защищенном хранилище платформы, обновляет ее и подставляет токен в вызовы API, так что собирать все это по частям не нужно. SDK есть для Android (Kotlin), iOS (Swift 6) и Flutter, где это обертка над двумя нативными SDK. Нужен провайдер, который подходит под контракт со страницы Руководства по провайдерам.

Как установить Versola OAuth SDK?

У каждой платформы своя зависимость и свое руководство.

ПлатформаУстановкаЧто импортировать
Androidimplementation("io.versola:oauth-android:<version>") из Maven Centralversola.oauth.OAuthClient
iOSSwift Package Manager: https://github.com/versolauth/versola-sdk, продукт VersolaOAuthimport OAuthClient
FlutterGit-зависимость от https://github.com/versolauth/versola-sdk.git, путь flutter/versola_oauthpackage:versola_oauth/versola_oauth.dart

Там, где в примерах стоит <version>, подставьте текущую версию SDK. Она показана в верхней панели этих страниц и на странице Releases.

Шаги настройки, объявление редиректа и работающий вход описаны в руководствах Android, iOS и Flutter.

Как это устроено

Логика протокола написана один раз для каждой нативной платформы, на Kotlin для Android и на Swift для iOS, по общей спецификации. Flutter — обертка над двумя нативными SDK, поэтому логика протокола в Dart не выполняется. Все платформы отдают один и тот же OAuthClient, те же семь состояний сессии и те же четыре категории ошибок.

ПлатформаЯзык и минимумПакет или модуль
AndroidKotlin, minSdk 26Пакет versola.oauth, артефакт io.versola:oauth-android
iOSSwift 6, iOS 17.4Продукт VersolaOAuth, модуль OAuthClient
FlutterDart 3.13, Flutter 3.47package:versola_oauth

Что делает SDK без лишнего кода?

Каждый пункт — правило SDK, и ни одно не отключается.

  • PKCE с S256, свежие state и nonce на каждый запрос из генератора случайных чисел платформы и проверка редиректа (state, затем iss по RFC 9207, если провайдер объявляет или присылает его, затем code) до любого сетевого запроса.
  • Проверка ID-токена до того, как что-либо сохранено: подпись по ключам провайдера, iss, aud и azp, exp и iat с ограниченным допуском на расхождение часов (по умолчанию 60 s, максимум 5 минут), nonce и auth_time при max_age.
  • Обновление в одном полете: параллельные вызовы делят один запрос токена, а ротированный refresh-токен сохраняется раньше, чем забывается старый.
  • Защищенное хранилище: файлы под noBackupFilesDir, обернутые ключом Keystore, на Android; Keychain с AfterFirstUnlockThisDeviceOnly и без синхронизации с iCloud на iOS.
  • Только системный браузер: Auth Tab или Custom Tab на Android, ASWebAuthenticationSession на iOS. Передать web view нельзя.
  • Токен уходит только на источники (origins), перечисленные в protectedOrigins. Запрос на любой другой источник проходит нетронутым, а редиректы на защищенных запросах не выполняются.
  • DPoP (RFC 9449), если вы включили его и провайдер объявляет ES256, с неизвлекаемым ключом в аппаратном хранилище. Иначе bearer с предупреждением в логе или ошибка, если вы сделали DPoP обязательным.
  • Pushed authorization requests (RFC 9126), если провайдер объявляет для них эндпоинт.
  • Секрета клиента нет: нативное приложение не может его хранить, поэтому в конфигурации под него нет поля.

Если проверку не удалось завершить, операция падает с типизированной ошибкой. Выключить проверку нельзя, и ни одну не ослабляют ради того, чтобы заработал какой-то провайдер. Подробнее: Состояния сессии и ошибки.

Какие провайдеры поддерживаются?

От провайдера SDK ждет четыре вещи: discovery (или явные эндпоинты), authorization code flow с PKCE S256 для публичного клиента, ID-токен с асимметричной подписью и claim iss, равный объявленному издателю. Все остальное определяется по discovery, и SDK подстраивается под то, чего нет.

ПровайдерСтатус
Keycloak 26.4Покрыт интеграционными тестами
Ory Hydra v26.2.0Покрыт интеграционными тестами

Подробности, включая то, какому провайдеру для refresh-токена нужен offline_access и у кого нет эндпоинта выхода, на странице Руководства по провайдерам.

Как тестируется SDK?

В таблице — то, что прогоняют собственные тесты SDK на каждой платформе.

ПлатформаТесты
AndroidМодульные тесты на JVM и Robolectric. Тесты Keystore на эмуляторе для хранилища и DPoP-ключей. Инструментальный smoke-тест в демо-приложении. Интеграционные тесты на контейнерах Keycloak 26.4 и Ory Hydra v26.2.0
iOSМодульные тесты XCTest на симуляторе iOS. Интеграционные тесты на контейнерах Keycloak 26.4 и Ory Hydra v26.2.0
FlutterМост Pigeon над нативными SDK. Dart-тесты на подмененном канале. Модульные тесты нативной обвязки. Те же интеграционные сценарии через мост, как нативные тесты в примере приложения

Что дальше