🚨 HATA ANALİZİ 25 Aralık 2025

Livewire 419 Hatası - CSRF Token Mismatch

Multi-tenant sistemde session lifetime ve CSRF token uyumsuzluğu sorunu

📝 Basit Anlatım (Herkes İçin)

Sorun Nedir?
Sitelerinizde (ixtif.com, muzibu.com) kullanıcılar sayfayı açtıktan 2 saat sonra işlem yapmak istediğinde "419 Page Expired" hatası alıyorlar. Özellikle Livewire ile çalışan dinamik sayfalar etkileniyor.

Neden Oluyor?
Güvenlik için her kullanıcıya bir "oturum süresi" veriliyor. Şu anda bu süre sadece 2 saat. Kullanıcı sayfayı açık bırakıp 2 saatten sonra bir butona tıkladığında, sistem "oturumun süresi doldu" diyor ve işlemi reddediyor.

Neden Önemli?
• Kullanıcı deneyimi bozuluyor (sayfayı yenilemek zorunda kalıyor)
• Müzik platformunda (muzibu.com) şarkı dinlerken oturum kapanıyor
• E-ticaret sitelerinde (ixtif.com) sepet işlemleri yarıda kalabiliyor
• Profesyonel olmayan bir izlenim veriyor

🎯 Hedef:

Oturum süresini 2 saatten 7 güne çıkararak kullanıcıların haftalarca giriş yapmadan site kullanabilmesini sağlamak.

🔧 Teknik Detaylar (Geliştiriciler İçin)

📋 Browser Console Hatası:

/livewire/update:1  Failed to load resource: the server responded with a status of 419 ()

🔍 Tespit Edilen Sorunlar:

1. Session Lifetime Çok Kısa (KRİTİK SORUN)

Mevcut Durum:

  • ixtif.com → auth_session_lifetime = 120 dakika (2 saat)
  • muzibu.com → auth_session_lifetime = 120 dakika (2 saat)
  • tuufi.com (central) → SESSION_LIFETIME = 10080 dakika (7 gün) ✅

Sorun: Tenant'lar 2 saat, central 7 gün kullanıyor. Tutarsızlık var!

2. Tenant Setting Override

Dosya: app/Providers/TenancyServiceProvider.php:117-119

// 🔐 Session lifetime: Tenant setting'den al
$sessionLifetime = (int) setting('auth_session_lifetime', 525600);
if ($sessionLifetime > 0) {
    config(['session.lifetime' => $sessionLifetime]);
}

Sorun: Her tenant kendi setting'ini kullanıyor, .env SESSION_LIFETIME override ediliyor.

Default: 525600 dakika (1 yıl!) ama tenant'larda 120 set edilmiş.

3. Redis Session Storage

Durum: ✅ Doğru çalışıyor

  • Redis DB 0: 317 active session
  • Session driver: redis (performans için doğru)
  • Redis bağlantısı: PONG (çalışıyor)

4. Cookie Ayarları

Durum: ✅ Güvenlik ayarları doğru

  • secure: true → HTTPS zorunlu ✅
  • httponly: true → JS erişimi engelli ✅
  • samesite: lax → CSRF koruması ✅
  • domain: .domain.com → Subdomain desteği ✅

⚠️ 419 Hatası Nasıl Oluşuyor?

  1. Kullanıcı siteyi açıyor → Session ve CSRF token oluşuyor (2 saat geçerli)
  2. Kullanıcı sayfayı açık bırakıyor (örnek: müzik dinliyor, ürün araştırıyor)
  3. 2 saat sonra → Session Redis'te expire oluyor
  4. Livewire butona tıklanıyor → /livewire/update request atılıyor
  5. Laravel CSRF kontrolü yapıyor → Session yok → 419 Token Mismatch!

🎯 Çözüm Planı (Adım Adım)

✅ ÖNERİLEN

Seçenek 1: Tenant Setting'lerini Güncelle

Tüm tenant'larda auth_session_lifetime değerini 10080 dakikaya (7 gün) çıkar.

Komut:

php artisan tinker

// Tenant 2 (ixtif.com)
tenant(2);
setting(['auth_session_lifetime' => 10080]);
echo "İxtif setting güncellendi: " . setting('auth_session_lifetime');

// Tenant 1001 (muzibu.com)
tenant(1001);
setting(['auth_session_lifetime' => 10080]);
echo "Muzibu setting güncellendi: " . setting('auth_session_lifetime');

exit;

Artıları:

  • Hızlı ve kolay (2 dakikada çözüm)
  • Tenant bazlı kontrol devam eder (esneklik)
  • Kod değişikliği yok (risk yok)

Eksileri:

  • Her yeni tenant için manuel ayar gerekir
  • Admin panel ayarlarından değiştirilebilir (bilinçsiz değişiklik riski)
🔧 ALTERNATİF

Seçenek 2: TenancyServiceProvider Override Kaldır

Tenant setting'ini kaldır, tüm tenant'lar .env SESSION_LIFETIME kullanır (10080 dakika).

Kod Değişikliği:

Dosya: app/Providers/TenancyServiceProvider.php:116-120

// ❌ KALDIR
// 🔐 Session lifetime: Tenant setting'den al
$sessionLifetime = (int) setting('auth_session_lifetime', 525600);
if ($sessionLifetime > 0) {
    config(['session.lifetime' => $sessionLifetime]);
}

// ✅ EKLE (ya da sadece yukarıyı sil, .env default kullanılır)
// Session lifetime .env'den alınır (SESSION_LIFETIME=10080)

Artıları:

  • Merkezi kontrol (.env'den tek yerden yönetim)
  • Yeni tenant'lar otomatik doğru değeri alır
  • Admin panel'den yanlışlıkla değiştirilemez

Eksileri:

  • Kod değişikliği gerekir (test gerekir)
  • Tenant bazlı farklı süre ayarlama esnekliği kaybolur
⚙️ GELİŞMİŞ

Seçenek 3: Hibrit Çözüm (Fallback Mekanizması)

Tenant setting varsa kullan, yoksa .env SESSION_LIFETIME'a düş. Minimum değer kontrolü ekle.

Kod Değişikliği:

// 🔐 Session lifetime: Tenant setting'den al (fallback: .env)
$sessionLifetime = (int) setting('auth_session_lifetime', config('session.lifetime'));

// ⚠️ Minimum 7 gün kontrolü (güvenlik)
if ($sessionLifetime < 10080) {
    \Log::warning("Tenant session lifetime çok kısa, 7 güne çekildi", [
        'tenant_id' => tenant()->id,
        'old_lifetime' => $sessionLifetime,
    ]);
    $sessionLifetime = 10080;
}

config(['session.lifetime' => $sessionLifetime]);

Artıları:

  • En esnek çözüm (tenant bazlı kontrol + merkezi fallback)
  • Minimum değer kontrolü (güvenlik)
  • Log ile takip edilebilir

Eksileri:

  • Daha karmaşık kod (bakım gerektirir)
  • Log dosyası şişebilir (eğer sürekli warning gelirse)

🧪 Test Planı

1. Değişiklik Öncesi Test

# Session lifetime kontrolü
php artisan tinker --execute="tenant(2); echo setting('auth_session_lifetime');"
php artisan tinker --execute="tenant(1001); echo setting('auth_session_lifetime');"

# Cookie test
curl -I -k https://ixtif.com/ | grep -i "set-cookie"
curl -I -k https://muzibu.com/ | grep -i "set-cookie"

2. Değişiklik Sonrası Test

# Cache temizle
php artisan config:clear
php artisan cache:clear
php artisan responsecache:clear

# Session lifetime kontrolü (10080 olmalı)
php artisan tinker --execute="tenant(2); echo setting('auth_session_lifetime');"

# Cookie Max-Age kontrolü (604800 saniye = 7 gün olmalı)
curl -I -k https://ixtif.com/ | grep -i "max-age"

3. Production Test

  • Livewire formlarında butona tıklama (admin panel)
  • Müzik player'da şarkı değiştirme (muzibu.com)
  • Sepet işlemleri (ixtif.com)
  • 2 saat bekle → Tekrar işlem yap (419 almamalı)
  • a-console.txt'yi kontrol et (yeni 419 hatası olmamalı)

⚠️ Dikkat Edilecek Noktalar

🔐

Güvenlik:

7 günlük session süresi güvenli. Otomatik logout sistemi mevcut (kullanıcı logout yapınca session kapanır).

💾

Redis Kullanımı:

7 günlük session Redis'te daha fazla yer kaplayabilir ama Redis'in memory limiti yeterli (6GB). 317 aktif session → ~1MB kullanım.

🔄

Cache:

Değişiklik sonrası MUTLAKA config:clear, cache:clear, responsecache:clear çalıştır!

👥

Kullanıcı Deneyimi:

Mevcut kullanıcılar logout olabilir (cookie yenilenecek). Kullanıcılara duyuru yapılabilir.

🎯 Beklenen Sonuç

❌ Öncesi (Şimdiki Durum)

  • Session süresi: 2 saat
  • 419 hatası: Sürekli oluyor
  • Kullanıcı deneyimi: Kötü
  • Sayfa yenileme: Gerekli

✅ Sonrası (Hedef)

  • Session süresi: 7 gün
  • 419 hatası: Yok
  • Kullanıcı deneyimi: Mükemmel
  • Sayfa yenileme: Gereksiz

Performans Etkisi: Yok. Redis'te session sayısı değişmez, sadece TTL uzar. Memory kullanımı minimal artış (~%5-10).