Реалізація OAuth 2.0 для мобільного додатку
Ми часто бачимо проєкти, де авторизація OAuth 2.0 реалізована через застарілі або небезпечні схеми. Ми використовуємо Authorization Code Flow з PKCE — єдиний коректний варіант для нативних додатків. Implicit Flow застарів із виходом RFC 9700, а Client Credentials не дає користувацького контексту. Якщо вам пропонують Implicit Flow для мобільного додатку — це тривожний сигнал. Наша команда має 5+ років досвіду та реалізувала понад 30 OAuth-інтеграцій.
Як працює PKCE?
PKCE (Proof Key for Code Exchange) вирішує проблему відсутності client_secret у мобільному коді. Додаток генерує випадковий code_verifier, хешує його SHA-256 і передає code_challenge на сервер авторизації. При обміні коду на токен сервер перевіряє, чи відповідає verifier challenge. Перехопити код і використати без verifier неможливо. OAuth 2.0 з PKCE забезпечує надійну авторизацію.
// iOS - генерація verifier var buffer = [UInt8](repeating: 0, count: 32) _ = SecRandomCopyBytes(kSecRandomDefault, buffer.count, &buffer) let verifier = Data(buffer).base64URLEncodedString() // Android val bytes = ByteArray(32) SecureRandom().nextBytes(bytes) val verifier = Base64.encodeToString(bytes, Base64.URL_SAFE or Base64.NO_PADDING or Base64.NO_WRAP) Чому Universal Links кращі за Custom URL Scheme для OAuth 2.0?
Схема виду myapp://callback може бути перехоплена будь-яким додатком, зареєструвавшим такий самий ідентифікатор. Universal Links на iOS та App Links на Android перевіряють цифрові сертифікати домену через apple-app-site-association або assetlinks.json. Тільки ваш сайт може бути авторизований для відкриття додатка.
Налаштування цього механізму вимагає:
- AASA-файл на
https://yourapp.com/.well-known/apple-app-site-association - Capability
Associated Domainsзapplinks:yourapp.com - Обробка URL в
scene(_:continue:)абоapplication(_:continue:restorationHandler:)
Бібліотеки для OAuth 2.0 в мобільному додатку
Не реалізуйте протокол з нуля. AppAuth (iOS/Android), react-native-app-auth, flutter_appauth беруть на себе PKCE, відкриття браузера та обробку redirect. AppAuth краще власної реалізації в 3 рази за швидкістю розробки та виключає типові вразливості. За нашими даними, використання PKCE знижує ризик перехоплення коду на 99.9% порівняно з Implicit Flow.
Зберігання токенів
Короткоживучий токен тримайте в оперативній пам'яті (наприклад, @State у SwiftUI). Refresh token — у захищеному сховищі: Keychain на iOS, EncryptedSharedPreferences на Android. Перехоплення такого токену з SharedPreferences на рутованому пристрої — реальний вектор атаки.
Ротація refresh token та виявлення компрометації
Ротація refresh token — обов'язкова практика для продакшн-додатків. При кожному успішному обміні сервер видає новий access token, а попередній refresh token негайно інвалідується. Якщо зловмисник викрав токен і спробує скористатися вже недійсним, сервер виявить колізію і відкличе всю сесію цілком. Keycloak включає ротацію через revokeRefreshToken: true, AWS Cognito — через параметр Refresh Token Revocation.
Рекомендований термін життя: токен доступу — 15–60 хвилин, refresh token — 30–90 днів із sliding-window продовженням при кожному використанні. Обов'язково реалізуйте logout з відкликанням токену на сервері — виклик /revoke endpoint за RFC 7009. Довгоживучий токен оновлення без відкликання при виході — найчастіше джерело компрометації акаунтів у мобільних додатках.
Обробка state та захист від CSRF
State-параметр — випадковий рядок, який додаток передає в authorization request і перевіряє в redirect. Без перевірки state можлива CSRF-атака: зловмисник підставляє чужий код авторизації, і додаток пов'язує його акаунт із сесією жертви. AppAuth генерує та валідує state автоматично. Якщо ви пишете OAuth-клієнт вручну — state обов'язковий. Audit-логування кожного запиту авторизації з device fingerprint, IP та User-Agent дозволяє виявляти аномалії. Наш досвід у 30+ OAuth-інтеграціях показує: саме журнали подій виявляли інциденти несанкціонованого доступу протягом кількох хвилин.
Порівняння OAuth Flows
| Flow | Безпека | Мобільна підтримка | Статус |
|---|---|---|---|
| Implicit | Низька (токен в URL) | Ні (RFC 9700 deprecated) | Застарів |
| Authorization Code | Середня (потребує client_secret) | Частково | Рідко |
| Authorization Code + PKCE | Висока | Повна | Рекомендується |
Покрокова реалізація на iOS
- Встановіть AppAuth через CocoaPods або SPM.
- Налаштуйте
ASWebAuthenticationSessionдля відкриття браузера. - Реалізуйте генерацію
code_verifierтаcode_challenge. - Обробіть redirect через Universal Links.
- Після отримання збережіть access-токен у пам'яті, токен оновлення — у Keychain.
- Реалізуйте автоматичний refresh токену при закінченні терміну дії.
Що входить в роботу
Ми надаємо: документацію з інтеграції, доступи до тестових середовищ, навчання команди, підтримку на етапі релізу. Наш досвід 5+ років у мобільній безпеці гарантує, що ваше рішення пройде App Store Review (розділи 4.8, 5.1). Реалізуємо інтеграцію під ключ за 5–10 робочих днів для одного провайдера. Вартість інтеграції одного провайдера зазвичай становить від $1000 до $2000 залежно від складності. Ми пропонуємо безкоштовну оцінку вашого проекту.
Типові помилки: застосування Implicit-схеми, зберігання токенів у UserDefaults, відсутність PKCE. Ми перевіряємо ваш поточний код і безкоштовно оцінюємо проект.







