Yanlış Logout Mesajı Sorunu - Analiz ve Çözüm
Kullanıcılar müzik dinlerken oturumları kapanıyor ve "Başka bir cihazdan giriş yapıldı" mesajı görüyorlardı. Ama kimse başka cihazdan giriş yapmamıştı! Mesaj tamamen yanlıştı.
Sistem 4 farklı sebepten oturumu kapatabiliyordu:
Yani 4 sebepten sadece 1'inde mesaj doğruydu, diğer 3'ünde kullanıcı yanıltılıyordu!
Sistem artık oturumu kapatırken "neden kapattığını" hatırlıyor. Kullanıcı geri geldiğinde gerçek sebebi gösteriyor:
Artık kullanıcılar neden logout olduklarını tam olarak biliyorlar. Yanlış "başka cihazdan giriş" uyarısı görmeyecekler.
app/Http/Controllers/Api/Auth/AuthController.php:210
if (!$deviceService->sessionExists($user)) {
return response()->json([
'valid' => false,
'reason' => 'session_terminated',
'message' => 'Başka bir cihazdan giriş yapıldı.', // ❌ HER ZAMAN AYNI!
]);
}
Sistem sadece session'ın DB'de olup olmadığını kontrol ediyordu. Session yoksa → "LIFO kicked" olduğunu varsayıyordu. Ama 4 farklı sebep vardı!
Session silinirken nedeni cache'e kaydediyoruz, kullanıcı polling yaptığında cache'den okuyup doğru mesajı gösteriyoruz.
session_deleted_reason:{user_id}:{login_token}
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
if ($old->login_token) {
Cache::put(
"session_deleted_reason:{$user->id}:{$old->login_token}",
'lifo',
300
);
}
foreach ($staleSessions as $staleSession) {
if ($staleSession->login_token) {
Cache::put(
"session_deleted_reason:{$user->id}:{$staleSession->login_token}",
'60min_cleanup',
300
);
}
}
if ($session && $session->login_token) {
Cache::put(
"session_deleted_reason:{$user->id}:{$session->login_token}",
'manual_logout',
300
);
}
if ($session && $session->login_token) {
Cache::put(
"session_deleted_reason:{$session->user_id}:{$session->login_token}",
'admin_terminated',
300
);
}
use Illuminate\Support\Facades\Cache;
if (!$deviceService->sessionExists($user)) {
// Cache'den silinme nedenini oku
$cookieToken = $request->cookie('mzb_login_token');
$deletedReason = null;
if ($cookieToken) {
$cacheKey = "session_deleted_reason:{$user->id}:{$cookieToken}";
$deletedReason = Cache::get($cacheKey);
// Cache'den okuduktan sonra sil (tek kullanımlık)
if ($deletedReason) {
Cache::forget($cacheKey);
}
}
// Reason'a göre mesaj belirle
$message = match($deletedReason) {
'lifo' => 'Başka bir cihazdan giriş yapıldı.',
'60min_cleanup' => 'Oturumunuz 60 dakika inaktif kaldığı için otomatik olarak kapatıldı.',
'manual_logout' => 'Oturumunuz kapatıldı.',
'admin_terminated' => 'Oturumunuz yönetici tarafından sonlandırıldı.',
default => 'Oturumunuz sonlandırıldı. Lütfen tekrar giriş yapın.',
};
return response()->json([
'valid' => false,
'reason' => 'session_terminated',
'message' => $message, // ✅ DOĞRU MESAJ!
]);
}
60min_cleanupmanual_logoutlifoadmin_terminatednullUser 2 yanlış "başka cihazdan giriş" mesajı aldı. Log analizi başladı.
60 dakika cleanup sisteminin yanlış mesaj gösterdiği tespit edildi.
Cache-based reason tracking yaklaşımı tasarlandı.
DeviceService.php ve AuthController.php güncellendi.
5 senaryo test edildi, tüm mesajlar doğru çalışıyor. Sisteme deploy edildi.
🎉 Kullanıcılar artık neden logout olduklarını kesin olarak biliyorlar!