Versola OAuth SDK проводит вход через системный браузер, хранит сессию в защищенном хранилище платформы, обновляет ее и подставляет токен в вызовы API, так что собирать все это по частям не нужно. SDK есть для Android (Kotlin), iOS (Swift 6) и Flutter, где это обертка над двумя нативными SDK. Нужен провайдер, который подходит под контракт со страницы Руководства по провайдерам.
Как установить Versola OAuth SDK?
У каждой платформы своя зависимость и свое руководство.
| Платформа | Установка | Что импортировать |
|---|---|---|
| Android | implementation("io.versola:oauth-android:<version>") из Maven Central | versola.oauth.OAuthClient |
| iOS | Swift Package Manager: https://github.com/versolauth/versola-sdk, продукт VersolaOAuth | import OAuthClient |
| Flutter | Git-зависимость от https://github.com/versolauth/versola-sdk.git, путь flutter/versola_oauth | package:versola_oauth/versola_oauth.dart |
Там, где в примерах стоит <version>, подставьте текущую версию SDK. Она показана в верхней панели этих страниц и на странице Releases.
Шаги настройки, объявление редиректа и работающий вход описаны в руководствах Android, iOS и Flutter.
Как это устроено
Логика протокола написана один раз для каждой нативной платформы, на Kotlin для Android и на Swift для iOS, по общей спецификации. Flutter — обертка над двумя нативными SDK, поэтому логика протокола в Dart не выполняется. Все платформы отдают один и тот же OAuthClient, те же семь состояний сессии и те же четыре категории ошибок.
| Платформа | Язык и минимум | Пакет или модуль |
|---|---|---|
| Android | Kotlin, minSdk 26 | Пакет versola.oauth, артефакт io.versola:oauth-android |
| iOS | Swift 6, iOS 17.4 | Продукт VersolaOAuth, модуль OAuthClient |
| Flutter | Dart 3.13, Flutter 3.47 | package: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-тесты на подмененном канале. Модульные тесты нативной обвязки. Те же интеграционные сценарии через мост, как нативные тесты в примере приложения |
Что дальше
- Android, iOS и Flutter: установка SDK и вход на вашей платформе.
- Руководства по провайдерам: контракт провайдера и то, чем вендоры отличаются.
- Состояния сессии и ошибки: семь состояний и четыре категории ошибок, общие для всех платформ.
- Ошибки сервера, 429 и Retry-After: что SDK повторяет, когда провайдер отвечает 500, 503 или 429, и какой код нужен приложению.