Proje: Okul B2B App · Hub: Okul B2B App — Domain
Authentication Akışı
Giriş Yöntemleri
- Email + Şifre:
POST /auth/login→{ email, password } - 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)
- Adım 1:
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 82→05462519382905462519382→054625193825462519382→05462519382
Token Yönetimi
- Access token
expo-secure-store’daUSER_TOKENkey’i ile saklanır - Token
Authorization: Bearer {token}header’ı ile her istekte gönderilir - Token refresh:
/auth/refreshendpoint’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ı.
Related
- firma-okul-hiyerarsisi — giriş sonrası firma seçimi
- leads-basvu-yonetimi — authenticated lead işlemleri