Интеграция 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 for 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 — оцениваем отдельно по сложности.







