Kimlik doğrulama ve erişim
Bu sayfa oturumun nasıl açıldığını, rollerin nasıl birleştiğini ve API istemcisinin hangi başlıkları eklediğini açıklar. Kaynak doğrultusunda Next.js middleware, Zustand auth deposu, axios interceptor ve backend NestJS guard’ları birlikte çalışır.
Giriş ve kayıt
| Akış | Rota (FE) | Özet |
|---|---|---|
| E-posta / şifre girişi | /login | Başarıda accessToken + kullanıcı + org listesi döner; istemci token’ı saklar |
| Kayıt | /register | Ad, soyad, e-posta, şifre; bazı kurulumlarda organizationId isteğe bağlıdır |
| Şifremi unuttum | /forgot-password | E-posta ile sıfırlama akışı backend politikasına göre |
| Google OAuth | Giriş kartında düğme | NEXT_PUBLIC_GOOGLE_CLIENT_ID ve @react-oauth/google gerekir; locale tr / en ile uyumludur |
Auth rotaları ConditionalLayout ile ana kabuktan çıkarılır; böylece sidebar görünmez.
İki tür rol: bunları karıştırmayın
1) Hesap rolü (User.role)
JWT ve kullanıcı kaydı üzerinde gelir:
| Değer | Anlamı |
|---|---|
USER | Standart platform kullanıcısı |
SUPERADMIN | Platform operasyonu; mesajlaşma ortamı instanceları menüsü |
2) Organizasyon üyelik rolü (OrganizationMembership)
Bir kullanıcı aynı anda birden fazla org’a üye olabilir; her org için ayrı rol:
| Değer | Anlamı |
|---|---|
ORG_ADMIN | Üye daveti, org ayarları, çoğu yönetimsel CRUD |
MEMBER | Politikaya göre oluşturma/okuma; proje oluşturma çoğu kurulumda kısıtlıdır |
API tarafında RoleGuard ve @Roles(...) dekoratörleri genelde üyelik rolüne bakar. Örnek: POST /projects çoğu kurulumda ORG_ADMIN + abonelik projects özelliği ister.
Süper yönetici + projeler
Süper yönetici hesabıyla proje listesi boş veya 403 alıyorsanız, backend organizasyon bağlamı olmadan proje app uçlarını kasıtlı olarak kapatmış olabilir. Günlük proje işi için normal bir org üyesi kullanın. Ayrıntı: Kavramlar ve mimari.
Çoklu organizasyon
- Giriş yanıtı veya
/users/mebenzeri uçlar kullanıcının organizations[] dizisini döndürür. - Organizasyon seçici (navbar) tek org varsa yalnızca metin olarak adı gösterir; birden fazlaysa dropdown açar.
- Seçim değişince
OrganizationService.switchOrganizationçağrılır; başarılı olunca:activeOrganizationIdgüncellenir,- kullanıcı nesnesindeki
organizationIdhizalanır, - React Query önbelleği invalidate edilir.
Token ve depolama
token-storage modülü:
- Yazma: access token hem localStorage hem çerez (
access_token, SameSite=Lax, süre ~7 gün) içine konur; kullanıcı JSON’u da çift yazar (useranahtarı). - Okuma: önce çerez, yoksa localStorage — böylece alt alan SSO (
NEXT_PUBLIC_COOKIE_DOMAIN, örn..cereinsight.com) çalışır.
Middleware yalnızca çerezdeki access_token’ı görür; ilk istekta localStorage henüz okunamaz.
Axios istemcisi (apiClient)
Her istekte eklenen başlıklar:
Authorization: Bearer <token>—tokenStorage.getToken()X-Organization-Id: <uuid>—organizationStorage.getActiveOrganizationId()
401 interceptor davranışı:
- URL
/auth/login,/auth/register,/auth/forgot-password,/auth/reset-passworddeğilse:tokenStorage.clear()(token, user, aktif org id),window.location.href = "/login".
Bu yüzden geçersiz şifre ile giriş denemesi oturumu silmez; fakat süresi dolmuş JWT ile panoya gitmeye çalışırsanız tam tersi olur.
Korunan rotalar (Next.js middleware)
src/middleware.ts özet kuralları:
access_tokençerezi var ve path/login|/register|/forgot-passwordise →/yönlendir.- Çerez yok ve path public değilse →
/loginyönlendir. /_next,/api, dosya uzantılı istekler serbest.
Yerel geliştirme
Çerez domain’i boşken localhost’ta çapraz port senaryolarında çerez beklediğiniz gibi davranmayabilir; bu durumda localStorage yine de axios’ta token sağlar, fakat ilk HTML isteğinde middleware çerez görmezse yine login’e atabilirsiniz. Çözüm: aynı origin üzerinden FE ve BE proxy’lemek veya çerezin gerçekten yazıldığını doğrulamak.
Profil ve dil
Kullanıcı profili User tipinde language alanı taşıyabilir. Arayüz çevirileri useTranslation() ile tr / en dosyalarından gelir — ürün metinleri kod içinde gömülü olmamalıdır (kendi ürün kod tabanınız için kural).
Güvenlik pratikleri
- JWT’yi ekran görüntülerinde bulanıklaştırın.
- Ortak makinelerde çıkış yapın;
tokenStorage.clear()hem çerez hem localStorage’ı temizler. - API anahtarlarını yalnızca sunucu tarafında tutun; tarayıcıya sızdırmayın.
API referansı
- Auth uç noktaları
- Kimlik doğrulama genel
- Users uç noktaları — profil ve org listesi