📜

Dün Akşam 10'dan Sonra

Session Terminated - Yapılan Değişiklikler Analizi

22 Aralık 04:15 Büyük Overhaul 33 Dosya

📊 Özet: Tek Bir Büyük Commit

🕐 Tarih & Saat:

22 Aralık 2025, Sabah 04:15:33

🔖 Commit:

a630a4cd9 - 🔐 Muzibu Device/Session Limit System Overhaul

📦 Kapsam:

33 dosya değişti, +1303 satır eklendi, -718 satır silindi

📝 Basit Anlatım (Ne Yapıldı?)

Dün akşam 10'dan sonra TEK BİR BÜYÜK DEĞİŞİKLİK yapıldı:

🍪
Cookie-Based Device Detection

Her tarayıcıya özel bir "kimlik kartı" (mzb_login_token) veriliyor. Aynı tarayıcıdan tekrar giriş yapınca yeni cihaz olarak sayılmıyor.

🔄
LIFO Otomatiği

Yeni cihaz girişinde en eski cihaz otomatik çıkış yapıyor. Kullanıcıdan onay isteme kaldırıldı.

🚫
Rate Limit Fix

Session kontrol endpoint'i artık sınırsız. "Çok fazla istek" hatası vermiyor.

💥
Atomik Session Silme

Session silinirken hem database, hem Redis, hem cache aynı anda temizleniyor.

⚠️ ÖNEMLİ NOT:

Bu değişiklikler teoride doğru ama pratikçe cookie timing sorunu yaratmış olabilir. Login sonrası cookie browser'a ulaşmadan session check yapılıyor ve loop oluşuyor.

🔧 Ana Değişiklikler (Teknik Detaylar)

1️⃣ DeviceService.php - Tam Yeniden Yazıldı

registerSession() Fonksiyonu

ÖNCESİ:
  • Her login'de yeni token oluşturuyordu
  • LIFO manuel (kullanıcı cihaz seçimi modal)
  • Race condition yok
SONRASI:
  • Cookie'de token varsa aynı token kullan (AYNI TARAYICI)
  • Cookie yoksa yeni token oluştur (FARKLI TARAYICI)
  • LIFO otomatik (en eski session anında sil)
  • Distributed lock (Cache::lock) ile race condition önleme

sessionExists() Fonksiyonu

YENİ LOJİK:
  • Cookie'den login_token al
  • DB'de token eşleşiyor mu kontrol et
  • Cookie yoksa fallback: Tek session varsa cookie re-issue
  • Token eşleşmezse → LIFO tarafından kick edilmiş → FALSE

terminateSessionAtomicByRow() - YENİ

Atomik Silme:
  • DB'den sil
  • Redis'ten sil (stream key'leri)
  • Cache'e silme nedeni kaydet (lifo, manual_logout, admin_terminated)
  • Hepsi tek transaction'da

2️⃣ AuthController.php - checkSession() Değişti

Cookie Fallback Eklendi (satır 194-207)

if (!$cookieToken) {
  // Session varsa cookie yok = yeni login, geçerli
  $userSession = DB::table('user_active_sessions')
    ->where('user_id', $user->id)
    ->first();
  if ($userSession) {
    return ['valid' => true]; // ✓
  }
}

Session Termination Message

Reason-Based Messages:
  • 'lifo' → "Başka bir cihazdan giriş yapıldı"
  • 'manual_logout' → "Oturumunuz kapatıldı"
  • 'admin_terminated' → "Yönetici tarafından sonlandırıldı"

3️⃣ AuthenticatedSessionController.php - Modal Kaldırıldı

store() - Login Sonrası

SİLİNEN KOD:
  • isDeviceLimitExceeded() kontrolü
  • Device selection modal session data
  • Login page'e redirect (modal için)
YENİ LOJİK:
  • registerSession() çağır
  • LIFO içeride otomatik çalışıyor
  • Direkt anasayfaya yönlendir

create() - Login Page

SİLİNEN:
  • Device limit exceeded kontrolü
  • Authenticated kullanıcı için modal gösterme
YENİ:
  • Authenticated → Direkt anasayfaya redirect

4️⃣ routes/api.php + bootstrap/app.php - Rate Limit Fix

check-session ve active-devices endpoint'leri throttle dışına alındı.

Route::prefix('auth')->group(function () {
  Route::get('/check-session', ...); // No throttle
  Route::get('/active-devices', ...); // No throttle
});

5️⃣ SongStreamController.php - Stream Token Kontrolü

Stream ve HLS serve endpoint'lerinde login_token kontrolü eklendi.

  • Stream başlatmadan önce sessionExists() kontrol
  • HLS key/segment serve ederken token DB'de var mı kontrol
  • Token yoksa → 401 'session_terminated'

6️⃣ player-core.js - Network Error Tolerance

429 ve network error artık logout tetiklemiyor.

if (response.status === 429) {
  // Sadece log, logout YOK
  console.warn('Rate limit, retrying...');
  return; // Don't logout
}

📦 Değişen Dosyalar (33 Dosya)

🔧 Backend (Core)

  • Modules/Muzibu/app/Services/DeviceService.php
  • app/Http/Controllers/Api/Auth/AuthController.php
  • app/Http/Controllers/Auth/AuthenticatedSessionController.php
  • app/Services/SignedUrlService.php
  • app/Http/Middleware/CheckDeviceLimit.php (deleted)
  • app/Services/Auth/DeviceService.php (deleted)

🎵 Modules

  • Modules/Muzibu/Http/Controllers/Api/SongStreamController.php
  • Modules/Favorite/routes/api.php
  • Modules/Muzibu/lang/en/front.php
  • Modules/Muzibu/lang/tr/front.php

🎨 Frontend (JS)

  • public/themes/muzibu/js/player/core/player-core.js
  • public/themes/muzibu/js/player/features/play-helpers.js
  • public/themes/muzibu/js/muzibu-store.js

🖼️ Views (Blade)

  • resources/views/themes/muzibu/components/session-check.blade.php
  • resources/views/themes/muzibu/components/player.blade.php
  • resources/views/themes/muzibu/components/header.blade.php
  • +18 card component dosyası

⚙️ Config & Routes

  • bootstrap/app.php
  • routes/api.php
  • routes/web.php
  • app/Providers/TenancyServiceProvider.php

⚠️ Bu Değişikliklerden Kaynaklanan Potansiyel Sorunlar

1️⃣ Cookie Timing Race Condition

SORUN: Login sonrası cookie queue()->cookie() ile ekleniyor ama hemen browser'a gitmiyor. Session check 2 saniye sonra başlıyor ama cookie henüz gelmemiş olabilir.

→ Bu değişiklikten önce bu sorun yoktu çünkü token her zaman DB'deydi ve login_token cookie'sine bağlı değildi.

2️⃣ Fallback Her Zaman Çalışmıyor

SORUN: sessionExists() içinde fallback var: "Cookie yoksa tek session varsa geçerli say". Ama kullanıcının birden fazla session'ı varsa (başka cihazlarda) fallback çalışmıyor ve FALSE dönüyor.

→ İlk check'te tek session, fallback çalışıyor. İkinci check'te (5 saniye sonra) cookie hala yok ve artık fallback çalışmıyor → LOGOUT!

3️⃣ Login Page Auto-Redirect

SORUN: Device limit modal kaldırıldı. Login page'de authenticated kullanıcı direkt anasayfaya yönlendiriliyor. Ama session terminated ile gelen kullanıcı hala authenticated, loop oluşuyor.

→ Bu değişiklikten önce modal vardı ve authenticated kullanıcı modal görebiliyordu.

4️⃣ LIFO Otomatiği - Geri Dönüş Yok

SORUN: LIFO artık otomatik çalışıyor, kullanıcıya sormadan eski session siliniyor. Yanlış session terminate olursa kullanıcı hiç haberdar olmayabilir.

→ Bu değişiklikten önce kullanıcı hangi cihazı çıkış yaptıracağını seçiyordu.

Değişiklik Zamanlaması

04:15:33 🔐 Muzibu Device/Session Limit System Overhaul

BÜYÜK DEĞİŞİKLİK - 33 dosya, 1303+ satır

04:19:38 📄 Session/Device Limit Analysis Reports
04:35:09 📚 README.md güncelleme
04:58:45 🔧 Player: Preload auth error handling fix
05:26:10 + Alpine.js ve cache optimizasyonları (8 commit)