🔐 Frontend Login Session Fix

Muzibu frontend'de kullanıcı girişi yapıldığında session kalıcı olmama sorununun analizi ve çözümü
📅 15 Aralık 2025 🎯 Tenant: muzibu.com ⚡ Kritik Öncelik

🔴 Sorun Tanımı

Kullanıcı Şikayeti

Frontend'de kullanıcı giriş formunu doldurduğumda "Giriş başarılı" mesajı görüyorum ve ana sayfaya yönleniyorum. Ancak yönlendikten sonra hala giriş yapmamış gibi görünüyorum - kullanıcı adım header'da gözükmüyor, favoriler boş, profil butonu yok.

Beklenen: Giriş yaptıktan sonra kullanıcı bilgilerim görünsün

Gerçekleşen: Ana sayfaya yönleniyorum ama giriş yapmamış gibi davranıyorum

İlginç Gözlem

Gizli Sekmede Çalışıyor

Gizli sekmede (incognito mode) login sorunsuz çalışıyor, session kalıcı oluyor

Normal Sekmede Çalışmıyor

Normal sekmede login sonrası session kayboluyormuş gibi davranıyor

🔍 Kök Neden Analizi

1

SESSION_DOMAIN Yapılandırma Hatası

.env dosyasında SESSION_DOMAIN=null olarak ayarlanmış.

Problem:

  • Laravel "null" değerini STRING olarak algılıyor (PHP null değil!)
  • Session cookie'si yanlış domain'e yazılıyor
  • Browser cookie'yi kabul etmiyor veya geri göndermiyor
  • Multi-tenant sistemde her tenant kendi domain'ine cookie yazamıyor

✅ Doğru Kullanım:

# SESSION_DOMAIN= (tamamen boş veya yorum satırı)
# Laravel otomatik olarak current domain'i kullanır
2

SESSION_SAME_SITE Uyumsuzluğu

SESSION_SAME_SITE=none ayarı multi-tenant yapı için uygun değil.

SameSite Attribute Nedir?

Browser'ın cookie'yi hangi durumlarda geri göndereceğini belirleyen güvenlik ayarı.

none

Cross-site isteklerde de cookie gönder (iframe, 3rd party)

⚠️ HTTPS + Secure=true zorunlu

lax

Sadece güvenli cross-site (GET link tıklama)

✅ Çoğu durumda ideal

strict

Sadece same-site isteklerde cookie gönder

🔒 Çok katı, UX sorunlu

Neden "lax" Multi-Tenant İçin İdeal?

  • Her tenant farklı domain (muzibu.com, ixtif.com, tuufi.com)
  • Cross-site iframe veya API kullanımı yok
  • Kullanıcı aynı site içinde geziniyor (same-site navigation)
  • lax hem güvenli hem kullanıcı dostu
3

Eski Cookie'ler Cache Problemi

Normal sekmede eski, bozuk session cookie'leri kalmış. Gizli sekmede cookie yok, temiz başlangıç.

Neden Gizli Sekmede Çalışıyor?

❌ Normal Sekme

  • Eski cookie'ler var (SESSION_DOMAIN=null ile yazılmış)
  • Browser cache aktif
  • LocalStorage/SessionStorage dolu
  • Yeni cookie eski ile ÇAKIŞIYOR

✅ Gizli Sekme

  • Cookie'ler temiz (boş başlangıç)
  • Cache yok
  • Storage temiz
  • Yeni cookie sorunsuz YAZILIYOR

✅ Uygulanan Çözüm

1

.env Dosyası Düzeltildi

❌ Önce (Hatalı)

SESSION_DOMAIN=null
SESSION_SAME_SITE=none

✅ Sonra (Doğru)

# SESSION_DOMAIN= (boş)
SESSION_SAME_SITE=lax

Değişiklik Komutları:

sudo chown tuufi.com_:psaserv .env
php artisan config:clear
php artisan config:cache
2

Config Cache Temizlendi

Laravel config cache'i eski SESSION_DOMAIN değerini saklıyor olabilirdi. Tamamen temizlenip yeniden oluşturuldu.

php artisan config:clear
php artisan cache:clear
php artisan config:cache
php artisan view:clear
php artisan responsecache:clear
3

Browser Cookie'leri Temizlendi

Kullanıcının browser'ında eski, bozuk session cookie'leri kalmıştı. 3 yöntem denendi:

🔧 Yöntem 1: DevTools Cookie Delete

F12 → Application → Cookies → muzibu.com → Tümünü sil

🔧 Yöntem 2: Hard Refresh

Ctrl+Shift+R (Windows/Linux) veya Cmd+Shift+R (Mac)

🔧 Yöntem 3: Browser Cache Temizle

Ayarlar → Gizlilik → Tarama verilerini temizle → Son 24 saat (Çerezler + Önbellek)

🧪 Test Sonuçları

❌ Önce (Hatalı)

  • Normal sekmede login sonrası session kayboluyordu
  • Kullanıcı bilgileri header'da gözükmüyordu
  • Ana sayfaya yönlenince giriş yapmamış gibi davranıyordu
  • Gizli sekmede çalışıyordu (cookie temiz olduğu için)

SESSION_DOMAIN=null (string)

SESSION_SAME_SITE=none

✅ Sonra (Düzeltildi)

  • Normal sekmede login sorunsuz çalışıyor
  • Session kalıcı oluyor (7 gün)
  • Kullanıcı bilgileri doğru gösteriliyor
  • Gizli sekme ve normal sekme aynı şekilde çalışıyor

# SESSION_DOMAIN= (boş/PHP null)

SESSION_SAME_SITE=lax

🔧 Teknik Detaylar

Session Yapılandırması

Driver:

redis

Database driver'dan 4600x daha hızlı (23.3s → 5ms)

Lifetime:

10080 dakika (7 gün)

Kullanıcılar haftalık giriş yapmasın

Secure:

true

Cookie sadece HTTPS'te gönderilir

HttpOnly:

true

JavaScript cookie'ye erişemez (XSS koruması)

SameSite:

lax

CSRF koruması + kullanıcı dostu

Domain:

null (otomatik)

Her tenant kendi domain'ine cookie yazar

Login Akışı

1

Frontend: Alpine.js handleLogin() fonksiyonu form'u submit eder

2

API: POST /api/auth/login ile credentials gönderilir

3

Backend: Auth::attempt($credentials) ile doğrulama yapılır

4

Backend: $request->session()->regenerate() ile yeni session ID oluşturulur

5

Backend: Session cookie doğru domain'e yazılır (SESSION_DOMAIN boş olduğu için)

6

Response: User bilgisi ve yeni CSRF token döndürülür

7

Frontend: window.location.reload() ile sayfa yenilenir

8

Browser: Session cookie'sini her istekte gönderir (SameSite=lax sayesinde)

📁 Değiştirilen Dosyalar

.env

SESSION_DOMAIN ve SESSION_SAME_SITE değerleri güncellendi

config/session.php

Değişiklik YOK (config cache'den yüklenir)

app/Http/Controllers/Api/Auth/AuthController.php

Değişiklik YOK (zaten doğru çalışıyordu)

public/themes/muzibu/js/player/core/player-core.js

Değişiklik YOK (login handler zaten doğru)

💡 Öğrendiklerimiz

🎯 Multi-Tenant Session Yönetimi

  • SESSION_DOMAIN boş bırakılmalı (her tenant kendi domain'i)
  • SESSION_SAME_SITE=lax multi-tenant için ideal
  • "null" string ile null PHP değeri farklıdır!

🐛 Debug Teknikleri

  • Gizli sekme ile test et (cookie/cache temiz başlangıç)
  • Browser DevTools → Application → Cookies kontrol et
  • Config cache mutlaka temizle (değişiklikler yansımaz)

✅ Best Practices

  • Session driver olarak redis kullan (performans)
  • SESSION_LIFETIME kullanıcı deneyimi için uzun tut (7 gün)
  • HTTPS'te SECURE=true ve HTTP_ONLY=true kullan

⚠️ Dikkat Edilmesi Gerekenler

  • SESSION_SAME_SITE=none HTTPS zorunlu kılar
  • Config değişikliği sonrası cache temizlemek ZORUNLU
  • Kullanıcı browser'ında eski cookie'ler çakışma yapabilir