🔐 Muzibu Login-Logout Döngü Hatası

Kullanıcı login yapınca otomatik logout oluyor - Çift session check sistemi çakışması

22 Aralık 2025
muzibu.com
📝

Basit Anlatım (Herkes İçin)

Sorun: Kullanıcı Muzibu'ya giriş yapıyor, ama sistem hemen ardından otomatik çıkış yapıyor. Kullanıcı giriş yapamıyor.

❌ Kullanıcı Deneyimi:

  1. Kullanıcı email/şifre giriyor → "Giriş Başarılı" ✅
  2. 2-5 saniye sonra → "Oturumunuz Sonlandırıldı" modal'ı açılıyor ❌
  3. Müzik çalmaya çalışıyor → "Başka cihazdan giriş yapıldı" mesajı ❌
  4. Tekrar login yapıyor → Aynı döngü tekrar ediyor 🔁

🔍 Neden Oluyor?

Sistemde iki farklı oturum kontrol mekanizması var ve birbirleriyle çakışıyorlar. Biri "kullanıcı oturumda mı?" diye kontrol ederken, diğeri "oturum DB'de kayıtlı mı?" diye kontrol ediyor. Login sonrası bu iki kontrol aynı anda çalışıyor ve yarış durumu (race condition) oluşuyor.

Kullanıcı login olduğunda, sistem oturum bilgisini veritabanına kaydetmesi gerekiyor. Ama kontrol mekanizmaları çok hızlı çalışıyor (2-5 saniye) ve bazen oturum henüz kaydedilmeden kontrol yapılıyor. Sonuç: "Oturum bulunamadı, çıkış yap!" ❌

🔧

Teknik Detaylar (Geliştiriciler İçin)

⚠️ İki Farklı Session Check Sistemi (ÇAKIŞMA!)

ESKİ

session-check.blade.php

  • 📁 Dosya:
    resources/views/themes/muzibu/components/session-check.blade.php
  • 🔗 Endpoint:
    /api/session/check
  • 📍 Tanım:
    routes/web.php:22
  • ⏱️ Interval: 5 saniye
  • 🎯 İşlem: Alpine.js component, 401 dönerse modal gösteriyor
YENİ

session.js

  • 📁 Dosya:
    public/themes/muzibu/js/player/features/session.js
  • 🔗 Endpoint:
    /api/auth/check-session
  • 📍 Tanım:
    routes/api.php:88 (AuthController)
  • ⏱️ Interval: 2 saniye ilk, sonra 5 saniye
  • 🎯 İşlem: Player core'a entegre, session yoksa logout

🏁 Race Condition (Yarış Durumu)

1️⃣

Login → registerSession()

AuthController login metodu (satır 39) session'ı DB'ye kaydetmeye başlıyor

2️⃣

Sayfa Yükleniyor

session-check.blade.php ve session.js ikisi de aktif oluyor

3️⃣

session.js → 2 saniye sonra checkSession() çağrıyor

Ama registerSession() henüz tamamlanmamış olabilir!

4️⃣

/api/auth/check-session → Session bulamıyor

AuthController checkSession() (satır 212): if (!$deviceService->sessionExists($user)) { Auth::logout(); }

5️⃣

❌ Kullanıcı LOGOUT!

"Başka cihazdan giriş yapıldı" modal'ı gösteriliyor

📂 İlgili Dosyalar

resources/views/themes/muzibu/components/session-check.blade.php

→ Satır 29: fetch('/api/session/check') her 5 saniyede bir

public/themes/muzibu/js/player/features/session.js

→ Satır 67: fetch('/api/auth/check-session') - 2 saniye sonra başlıyor

routes/web.php:22-68

→ /api/session/check endpoint tanımı (basit auth check)

routes/api.php:88

→ /api/auth/check-session endpoint (AuthController::checkSession)

app/Http/Controllers/Api/Auth/AuthController.php:164-267

→ checkSession() metodu - session DB kontrolü + logout logic

💡

Çözüm Önerileri

✅ ÖNERİLEN

Seçenek 1: session-check.blade.php KALDIR

  • Sebep: session.js daha gelişmiş ve player'a entegre
  • İşlem: session-check.blade.php component'ini devre dışı bırak veya sil
  • Artı: Tek bir session kontrol sistemi kalır, çakışma olmaz
  • Eksi: Yok (session.js zaten her şeyi yapıyor)
ALTERNATİF

Seçenek 2: session.js KALDIR

  • Sebep: session-check.blade.php daha basit ve hafif
  • İşlem: session.js içindeki startSessionPolling() çağrısını devre dışı bırak
  • Artı: Daha basit sistem
  • Eksi: Player entegrasyonu kaybedilir, device limit kontrolü eksik kalabilir
⚠️ RISKLI

Seçenek 3: Timing Ayarı

  • İşlem: session.js'deki ilk kontrol süresini 2 saniye → 10 saniye yaparak registerSession()'ın tamamlanmasını bekle
  • Artı: Her iki sistem de kalır
  • Eksi: Race condition riski hala var (yavaş sunucularda problem olabilir)
  • Not: Geçici çözüm, kalıcı değil

🎯 Önerilen Aksiyon Planı

1️⃣

session-check.blade.php component'ini kaldır

Component'i devre dışı bırak (if condition false yap) veya dosyayı tamamen sil

@if(false) {{-- DEVRE DIŞI --}}
2️⃣

session.js sistemi tek başına kullan

Player'a entegre, device limit kontrolü yapıyor, yeterli

3️⃣

Cache temizle ve test et

npm run prod && php artisan view:clear && php artisan responsecache:clear
4️⃣

Login/logout döngüsünü test et

Kullanıcı giriş yaptıktan sonra modal açılmamalı ve oturum devam etmeli