From 60e344598b5487bf9bbb424498322864c2c7548b Mon Sep 17 00:00:00 2001 From: Hamza-Ayed Date: Fri, 24 Jul 2026 23:45:28 +0300 Subject: [PATCH] Fix Admin login path issue and issue direct JWT on valid credentials --- backend/Admin/auth/login.php | 101 ++++++++--------------------------- 1 file changed, 22 insertions(+), 79 deletions(-) diff --git a/backend/Admin/auth/login.php b/backend/Admin/auth/login.php index df946cc7..3fca6fa1 100644 --- a/backend/Admin/auth/login.php +++ b/backend/Admin/auth/login.php @@ -114,90 +114,33 @@ try { // 2. التحقق من كلمة المرور if (password_verify($password, $admin['password'])) { - // إذا كان هذا مجرد تجديد للتوكن (إعادة الدخول التلقائي من التطبيق)، فلا داعي لإرسال OTP - if ($isRenewal) { - $jwtService = new JwtService($redis); - $role = $admin['role'] ?? 'admin'; - - // إلغاء التوكن القديم إذا وجد في Redis - if ($redis) { - $oldJti = $redis->get("active_jti:" . $admin['id']); - if ($oldJti) { - $jwtService->revokeToken($oldJti, 3600); - } - } - - $jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience, $fingerprint); - - // فك تشفير البيانات للعرض - if ($encryptionHelper && !empty($admin['name'])) { - $admin['name'] = $encryptionHelper->decryptData($admin['name']) ?: $admin['name']; - } - unset($admin['password']); - - printSuccess([ - "message" => "Login successful", - "admin" => $admin, - "jwt" => $jwt, - "expires_in" => 3600 - ]); - exit; - } - - // 3. توليد رمز تحقق OTP (3 أرقام) وإرساله عبر نظام OTP الموحد - $otp = (string)random_int(100, 999); - $encryptedPhone = $admin['phone'] ?? ''; + // إصدار التوكن النهائي للمشرف + $jwtService = new JwtService($redis); + $role = $admin['role'] ?? 'admin'; - if (empty($encryptedPhone)) { - jsonError("رقم الهاتف غير مسجل لهذا الحساب. يرجى مراجعة الإدارة."); - exit; + // إلغاء التوكن القديم إذا وجد في Redis + if ($redis) { + $oldJti = $redis->get("active_jti:" . $admin['id']); + if ($oldJti) { + $jwtService->revokeToken($oldJti, 3600); + } } - // فك تشفير رقم الهاتف (مخزن مشفراً في قاعدة البيانات) - $phone = ($encryptionHelper && !empty($encryptedPhone)) ? $encryptionHelper->decryptData($encryptedPhone) : $encryptedPhone; - if (!$phone || empty($phone)) { - $phone = $encryptedPhone; + $jwt = $jwtService->generateAccessToken($admin['id'], $role, $audience, $fingerprint); + + // فك تشفير البيانات للعرض + if ($encryptionHelper && !empty($admin['name'])) { + $admin['name'] = $encryptionHelper->decryptData($admin['name']) ?: $admin['name']; } + unset($admin['password']); - // استخدام نظام OTP الموحد (Nabeh API للواتساب) - require_once __DIR__ . '/../../auth/otp/providers.php'; - $country = 'Jordan'; - $method = 'whatsapp'; - - $success = false; - switch ($country) { - case 'Jordan': - $success = sendNabehOtp($phone, $otp, $method, 'admin'); - break; - default: - $success = sendNabehOtp($phone, $otp, $method, 'admin'); - break; - } - - // تخزين OTP (SHA-256 hash) مع الرقم المشفر من adminUser (توافق مع verify_login.php) - $otpHash = hash('sha256', $otp); - $stmt = $con->prepare("INSERT INTO token_verification_admin (phone_number, token, expiration_time) - VALUES (?, ?, DATE_ADD(NOW(), INTERVAL 10 MINUTE)) - ON DUPLICATE KEY UPDATE token = VALUES(token), expiration_time = VALUES(expiration_time)"); - $stmt->execute([$encryptedPhone, $otpHash]); - - // إخفاء جزء من الرقم في الاستجابة للأمان - $maskedPhone = (strlen($phone) > 7) ? substr($phone, 0, 4) . '****' . substr($phone, -3) : $phone; - - if ($success) { - printSuccess([ - "status" => "otp_required", - "message" => "تم إرسال رمز التحقق إلى WhatsApp الخاص بك.", - "phone" => $maskedPhone - ]); - } else { - error_log("[ADMIN_LOGIN_WARN] Nabeh OTP failed for $phone, but OTP stored for debugging"); - printSuccess([ - "status" => "otp_required", - "message" => "فشل إرسال واتساب. تحقق من error_log لمعرفة OTP.", - "phone" => $maskedPhone - ]); - } + printSuccess([ + "message" => "Login successful", + "admin" => $admin, + "jwt" => $jwt, + "expires_in" => 3600 + ]); + exit; } else { jsonError("كلمة المرور غير صحيحة."); }