Proje: Okul B2B App · Hub: Okul B2B App — Domain

Authentication Akışı

Giriş Yöntemleri

  1. Email + Şifre: POST /auth/login{ email, password }
  2. OTP (SMS):
    • Adım 1: POST /auth/otp{ value: "05XXXXXXXXX" } (SMS gönderir)
    • Adım 2: POST /auth/login{ value: "05XXXXXXXXX", code: "XXXXXX" } (doğrular ve giriş yapar)

Telefon Numarası Formatı

API Türkçe format bekler: 05XXXXXXXXX (11 karakter, 0 ile başlar).

Otomatik dönüşüm formatPhoneNumberForAPI() ile yapılır:

  • +90 546 251 93 8205462519382
  • 90546251938205462519382
  • 546251938205462519382

Token Yönetimi

  • Access token expo-secure-store’da USER_TOKEN key’i ile saklanır
  • Token Authorization: Bearer {token} header’ı ile her istekte gönderilir
  • Token refresh: /auth/refresh endpoint’i (SecureApiClient’ta), token süresi dolmadan 5 dakika önce yenilenir
  • Şu an OTP ve email login aynı token döner (refreshToken === accessToken)

Login Sonrası Akış

/auth/login başarılı
  → access_token ve ApiUser alınır
  → apiClient.setAuthToken(token)
  → /customer/me/firms çağrılır
  → user.companies doldurulur
  → tek firma: customer_id otomatik set edilir
  → SecureStorage'a kaydedilir
  → OneSignal external user ID set edilir
  → setIsAuthenticated(true) → CompanyProvider mount

Çıkış (Logout)

Fire-and-forget pattern: Önce kritik işlemler (token silme), ardından async temizlik:

// 1. Hızlı: UI state'i hemen güncelle
currentUser = null;
authToken = null;
apiClient.removeAuthToken();
await clearAuthData(); // SecureStore temizle
 
// 2. Fire-and-forget: beklenmeyen durumda UI engellenmesin
apiClient.post('/auth/logout').catch(() => {});
OneSignalService.removeExternalUserId().catch(() => {});
CustomerIOService.clearIdentity().catch(() => {});
 
// 3. Listeners'ları notify et → _layout setIsAuthenticated(false)
notifyLogout();

Şifre Değiştirme

POST /change-password{ current_password, password, password_confirmation }

Min 6 karakter şifre kuralı.