Muzibu - Kritik Bug Tespit Raporu
Giriş yaptığınızda sistem size bir kimlik kartı (cookie) vermesi gerekiyor. Ama bu kimlik kartı browser'ınıza ulaşmadan önce, sistem "kimliğiniz var mı?" diye soruyor.
Cookie henüz gelmediği için sistem "hayır yok" diyor ve sizi çıkış yapıyor.
AuthenticatedSessionController.php:store() (satır 149-168)
$request->session()->regenerate() - Session ID yenileniyor$deviceService->registerSession($user) - Session DB'ye kaydediliyorredirect($intendedUrl) - Anasayfaya yönlendiriliyorDeviceService.php:registerSession() (satır 146)
cookie()->queue(cookie('mzb_login_token', ...))
Cookie queue'ya ekleniyor (hemen set edilmiyor!)
session.js:startSessionPolling() (satır 29-33)
setTimeout(() => this.checkSessionValidity(), 2000)
2 saniye sonra session kontrolü yapılıyor
❌ Cookie henüz browser'a ulaşmamış olabilir!
AuthController.php:checkSession() (satır 194-207)
AuthController.php:checkSession() (satır 212)
if (!$deviceService->sessionExists($user))DeviceService.php:sessionExists() (satır 280)
$cookieToken = request()->cookie('mzb_login_token')session.js:handleSessionTerminated() (satır 196)
window.location.href = '/login?session_terminated=1'
Hard redirect ile login sayfasına gidiyor
AuthenticatedSessionController.php:create() (satır 24-29)
if (Auth::check()) return redirect('/')Laravel Cookie Middleware:
cookie()->queue(...) - Cookie queue'ya eklenirSet-Cookie header olarak eklenir⏱️ Bu süreç: ~50-200ms (network + browser processing)
⚠️ Ama session check 2000ms sonra başlıyor ve her 5 saniyede bir devam ediyor!
💡 İlk check'te cookie YENİDEN set edilebilir (fallback var), ama ikinci check'te cookie varsa geçerli, yoksa LIFO kick sanılıyor!
sessionExists() içinde cookie yoksa re-issue ediliyor (satır 299).
Ama bu cookie response ile browser'a gitmesi lazım.
Eğer aynı request içinde birden fazla kez sessionExists() çağrılırsa,
cookie henüz set olmamış olabilir.
→ Cookie queue'da ama browser'da değil. O request'te hala "cookie yok" dönüyor.
İlk session check (2.saniye): Cookie yok → Fallback çalışıyor → Cookie re-issue → TRUE dönüyor ✓
İkinci session check (7.saniye): Cookie hala yok/sorunu var → Fallback kodu "bir session var" kontrolü yapıyor. Ama bu sefer multiple session olabilir (aynı user birden fazla cihaz), o yüzden fallback FALSE dönüyor.
→ Kod: "Tek session değil, LIFO tarafından kick edilmiş olmalı" diyor ve logout yapıyor.
handleSessionTerminated() logout yapıyor ve login'e yönlendiriyor.
Ama Auth::logout() server-side session'ı hemen silmiyor olabilir (timing).
Login page'de Auth::check() hala TRUE dönüyor.
→ Login page otomatik anasayfaya redirect → Tekrar check → Loop!
Login'den sonraki ilk 10-15 saniye boyunca session check'lerde cookie yoksa toleranslı ol.
Dosya: AuthController.php:checkSession()
// Login timestamp'i session'a kaydet
// Login sonrası 15 saniye içindeyse ve cookie yoksa:
if (time() - session('login_timestamp') < 15) {
// Tek session varsa geçerli say, logout yapma
return ['valid' => true];
}
İlk session check'i 2 saniye değil 5 saniye sonra yap. Cookie kesinlikle set olmuş olur.
Dosya: session.js:29
setTimeout(() => {
this.checkSessionValidity();
}, 5000); // 2000 → 5000
⚠️ Ama bu kesin çözüm değil. Yavaş network'te gene sorun olabilir.
Cookie kontrolü yerine session ID ile DB kontrol et. Session ID Laravel session'dan gelir, cookie'ye ihtiyaç yok.
Dosya: DeviceService.php:sessionExists()
// Cookie yerine session ID kullan
$sessionId = $this->getCurrentSessionId();
$exists = DB::table($this->table)
->where('user_id', $user->id)
->where('session_id', $sessionId)
->exists();
⚠️ Ama bu LIFO mantığını bozabilir (aynı browser'dan logout/login'de yeni cihaz algılanır).
Login page'de authenticated kullanıcıyı hemen redirect etme. Önce session terminate nedeni kontrol et.
Dosya: AuthenticatedSessionController.php:create() satır 24
if (Auth::check()) {
// Session terminated parametresi varsa logout yap
if (request()->get('session_terminated')) {
Auth::logout();
// Login formunu göster
} else {
return redirect('/');
}
}
handleSessionTerminated() çağrıldığında bir flag set et. Bu flag varken session check yapma.
Dosya: session.js
// Flag ekle
sessionTerminatedHandled: false,
handleSessionTerminated() {
this.sessionTerminatedHandled = true;
localStorage.setItem('session_terminated_at', Date.now());
// ... logout işlemleri
}
checkSessionValidity() {
// Loop önleme
const terminatedAt = localStorage.getItem('session_terminated_at');
if (terminatedAt && Date.now() - terminatedAt < 30000) {
return; // Son 30 saniyede terminated olduysa check yapma
}
// ... normal check
}
Aşağıdaki 3 çözümü birlikte uygula:
→ Login sonrası 15 saniye tolerans
→ session_terminated parametresi varsa logout yap
→ Loop önleme mekanizması
✅ Bu kombinasyon: