Інтеграція Firebase Authentication в мобільний додаток
Firebase Authentication вирішує великий обсяг роботи з коробки: Email/Password, Phone, Google, Apple, Facebook, GitHub, anonymous auth — все це готові провайдери. Але "з коробки" не означає "без конфігурації". Проекти, які просто додали FirebaseAuth.getInstance() і вважали завдання вирішеним, регулярно отримують проблеми у production.
Найпоширеніші помилки конфігурації
ID Token vs Custom Token vs Access Token. Firebase Auth повертає Firebase ID Token — JWT, підписаний Google. Це не OAuth 2.0 access token для стороннього API. Якщо ваш backend не Firebase — необхідно верифікувати Firebase ID Token на сервері (admin.auth().verifyIdToken()), отримати UID та видати свій JWT. Бачив проекти, де Firebase ID Token передавався напрямку стороннім API в надії, що "токен є — значить авторизований". Це не працює.
Оновлення токену. Firebase SDK автоматично оновлює ID Token щогодини. Але currentUser?.getIdToken(forceRefresh: false) повертає кешований токен, який може бути за 55 хвилин до закінчення. Якщо передаєте токен на backend — викликайте getIdToken(forceRefresh: true) перед кожним запитом або використовуйте Auth.auth().currentUser?.getIDTokenResult() для перевірки expirationDate.
Sign in with Apple — окрема конфігурація. Apple вимагає передачі nonce — випадкової строки, хеш якої включається в Apple Identity Token. Firebase перевіряє цей хеш. Без nonce інтеграція працює на етапі розробки, але падає у production на деяких конфігураціях Apple ID.
// iOS — правильна інтеграція Sign in with Apple + Firebase
let nonce = randomNonceString()
currentNonce = nonce
let request = ASAuthorizationAppleIDProvider().createRequest()
request.requestedScopes = [.fullName, .email]
request.nonce = sha256(nonce)
При отриманні Apple credential:
let credential = OAuthProvider.appleCredential(
withIDToken: appleIDToken,
rawNonce: nonce, // передаємо оригінальний nonce, не хеш
fullName: appleIDCredential.fullName
)
Auth.auth().signIn(with: credential)
Phone Authentication: нюанси
Firebase Phone Auth працює через reCAPTCHA верифікацію на iOS та Play Integrity / SafetyNet на Android. Проблеми:
- На симуляторі iOS автоматично використовується invisible reCAPTCHA — у production на реальному пристрої поведінка може відрізнятися (з'являється challenge).
-
verifyPhoneNumberвимагаєAPNsналаштування для silent push на iOS — без цього верифікація не проходить на пристроях з push notifications. - На Android:
PhoneAuthProvider.verifyPhoneNumberзPhoneAuthOptions.Builder. ВикористовуємоsetActivity(this)— без прив'язки до Activity автоматичне визначення не працює.
Тестові номери телефонів у Firebase Console (+1 650-555-3434) дозволяють тестувати без реальних SMS — додайте їх для QA-середовища.
Listeners: AuthStateListener та IdTokenChangedListener
Два різні listener — різні події:
-
addAuthStateListenerспрацьовує при login/logout користувача. -
addIdTokenChangedListenerдодатково спрацьовує при кожному оновленні ID Token (щогодини).
Для синхронізації токену з backend — використовуємо IdTokenChangedListener. Для навігаційних рішень (показати екран логіну / приховати) — AuthStateListener.
На iOS важливо знімати listener при dealloc/deinit:
deinit {
if let handle = authStateHandle {
Auth.auth().removeStateDidChangeListener(handle)
}
}
Інакше крах у момент, коли Firebase намагається викликати callback на вже деініціалізованому об'єкті.
Security Rules
Якщо використовуєте Firestore або Realtime Database — Security Rules повинні посилатися на request.auth.uid, а не довіряти client-side логіці. Типова дірка: колекція users без правила на читання — будь-який аутентифікований користувач читає дані будь-якого іншого.
Мінімальне правило:
match /users/{userId} {
allow read, write: if request.auth != null && request.auth.uid == userId;
}
Мультитенантність
Firebase Authentication підтримує tenants (через Google Cloud Identity Platform — розширена версія Firebase Auth). Якщо у вас SaaS з ізольованими клієнтами — це правильний шлях замість створення окремих Firebase проектів. Auth.auth().tenantID = "tenant-xyz" — переключає контекст.
Етапи інтеграції
Створення Firebase проекту та конфігурація провайдерів → додавання GoogleService-Info.plist / google-services.json → реалізація auth flow з обробкою помилок → налаштування backend-верифікації ID Token → тестування email/phone/social провайдерів → аудит Security Rules → тестування на реальних пристроях.
Термін: 6–10 робочих днів для стандартного набору провайдерів (email + google + apple). Кожен додатковий соціальний провайдер (Facebook, Twitter) — плюс 1–2 дні з урахуванням налаштування developer accounts.







