Інтеграція AWS Cognito для аутентифікації мобільного додатку
AWS Cognito — це два різних сервіси під однією дахом: User Pools (управління користувачами, аутентифікація) та Identity Pools (федеративні удостовіреня, тимчасові AWS credentials). Плутанина між ними — джерело більшості архітектурних помилок в проектах.
User Pool потрібен, коли ви хочете зберігати користувачів та видавати JWT-токени. Identity Pool потрібен, коли мобільному додатку потрібні тимчасові IAM credentials для прямого доступу до S3, DynamoDB або інших AWS сервісів. Часто потрібні обидва — User Pool для аутентифікації, Identity Pool для авторизації на AWS ресурси.
Amplify SDK vs aws-mobile-client
До 2020 року стандартним способом була AWSMobileClient. Зараз це legacy — офіційна рекомендація AWS — Amplify Libraries для iOS та Android. Amplify — високоуровневе обгортка, яка бере на себе:
- Конфігурацію через
amplifyconfiguration.json - Зберігання токенів (Keychain на iOS, EncryptedSharedPreferences на Android)
- Автоматичний refresh access token
- Hosted UI (OAuth 2.0 + PKCE flow через system browser)
Але у Amplify є проблема — він тягне багато залежностей. Якщо вам потрібна тільки аутентифікація без інших Amplify категорій — розмір додатку може вирости на 5–10 МБ. У таких випадках використовуємо AWSCognitoIdentityProvider напрямку (низькоуровневий SDK).
Hosted UI vs SRP
Cognito підтримує два flow:
Hosted UI — браузерний OAuth 2.0 + PKCE через ASWebAuthenticationSession (iOS) / Custom Tabs (Android). Cognito сам рендерить сторінки логіну. Зручно для швидкого старту та social providers (Google, Facebook через Cognito federation). Недолік: кастомізація обмежена CSS, нема нативного UX.
SRP (Secure Remote Password) — аутентифікація без передачи пароля в открому формі. Користувач вводить пароль в нативному UI, SDK виконує математичний протокол SRP з Cognito. Пароль ніколи не передається — тільки обчислені proof values. Це правильний вибір для нативних форм логіну.
Amplify використовує SRP за замовчуванням при виклику Amplify.Auth.signIn(username:password:). Важливо: SRP не працює без включеного USER_SRP_AUTH у налаштуваннях App Client Cognito User Pool.
MFA: TOTP vs SMS
Cognito підтримує обидва варіанти:
- SMS MFA — відправка коду через SNS. Просто налаштувати, але вимагає IAM роль для SNS та додаткові витрати на SMS.
-
TOTP (Time-based OTP) — Google Authenticator / Authy. Немає витрат на SMS, більш надійно проти SIM swap. Налаштування через
Amplify.Auth.setUpTOTP().
При TOTP setup: додаток отримує секретний ключ та QR-код URI (otpauth://totp/...). Відображаємо QR через CIQRCodeGenerator (iOS Core Image) або zxing (Android). Користувач сканує в authenticator app, вводить перший 6-значний код для верифікації.
// iOS — TOTP setup
Amplify.Auth.setUpTOTP() { result in
switch result {
case .success(let totpDetails):
let qrCodeURL = totpDetails.getSetupURI(appName: "MyApp", accountName: username)
// генеруємо QR з qrCodeURL
case .failure(let error):
print(error)
}
}
Custom Attributes та Lambda Triggers
Cognito User Pool дозволяє додавати кастомні атрибути (custom:role, custom:company_id). Вони включаються в ID Token та доступні у мобільному додатку без додаткових запитів.
Lambda Triggers — потужний інструмент для кастомної логіки:
-
Pre-sign-up: валідація домену email, блокування корпоративних аккаунтів. -
Post-confirmation: створення запису в базі даних після підтвердження email. -
Pre-token-generation: додавання кастомних claims в JWT на льоту.
Pre-token-generation особливо корисний: додаємо ролі з DynamoDB прямо в ID Token без додаткових API-вызовів з мобільного клієнта.
Device Tracking
Cognito підтримує deviceKey — при включеному відстеженні пристроїв користувач може дивитися список авторизованих пристроїв та видаляти їх. Amplify SDK автоматично зберігає deviceKey у Keychain/EncryptedSharedPreferences при першому логіні.
Включається у налаштуваннях User Pool → Devices → Always remember або User opt-in. Додає один параметр в auth flow — не впливає на продуктивність.
Типові проблеми
Token expiry vs refresh. Cognito access token живе від 5 хвилин до 24 годин (налаштовується). ID token — той же час. Refresh token — від 1 до 3650 днів. Amplify автоматично робить refresh, але якщо refresh token істек або відозваний — Amplify.Auth.fetchAuthSession() повертає AuthError.sessionExpired. Потрібно поймати та перенаправити на логін.
PKCE та App Client Secret. Мобільні App Clients у Cognito не повинні мати Client Secret — його неможливо безпечно зберігати у додатку. При створенні App Client: знімаємо галку "Generate client secret". Якщо секрет уже створено — створюємо новий App Client без нього.
Термін
Базова інтеграція (SRP auth + TOTP MFA + social providers + Amplify) — 7–12 робочих днів. Додавання Identity Pool + IAM roles для прямого доступу до S3/DynamoDB — плюс 3–5 днів. Lambda Triggers з custom business logic — оцінюємо окремо по складності.







