Skip to content

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/loginBaşarıda accessToken + kullanıcı + org listesi döner; istemci token’ı saklar
Kayıt/registerAd, soyad, e-posta, şifre; bazı kurulumlarda organizationId isteğe bağlıdır
Şifremi unuttum/forgot-passwordE-posta ile sıfırlama akışı backend politikasına göre
Google OAuthGiriş kartında düğmeNEXT_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ğerAnlamı
USERStandart platform kullanıcısı
SUPERADMINPlatform 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ğerAnlamı
ORG_ADMINÜye daveti, org ayarları, çoğu yönetimsel CRUD
MEMBERPolitikaya 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/me benzeri 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:
    • activeOrganizationId güncellenir,
    • kullanıcı nesnesindeki organizationId hizalanı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 (user anahtarı).
  • 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-password değ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-password ise → / yönlendir.
  • Çerez yok ve path public değilse → /login yö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ı

Sonraki adımlar

Cere Insight 2.0 dokümantasyonu