attributes->get('_jwt_user_id'); return $this->buildToken($userId, 'android/ios_passenger', $request->input('fingerPrint')); } // 2. مسار السائق public function generateDriverToken(Request $request) { $userId = $request->attributes->get('_jwt_user_id'); return $this->buildToken($userId, 'android/ios_driver', $request->input('fingerPrint')); } // 3. مسار المدير public function generateAdminToken(Request $request) { $userId = $request->attributes->get('_jwt_user_id'); return $this->buildToken($userId, 'web_admin', 'admin_secure_context'); } // 4. دالة البناء المركزية — متوافقة مع V1 authenticateJWT() private function buildToken($userId, $audience, $fingerprint) { // ⚠️ مهم جداً لموافاة V1: // سيرفر المحفظة (walletintaleq.intaleq.xyz) يستخدم V1authenticateJWT() // التي تقرأ المفتاح من: /home/intaleq-api/.secret_key // لذلك يجب استخدام jwt_secret هنا وليس wallet_jwt_secret. $secret = config('intaleq.jwt_secret'); if (empty($secret)) { return response()->json(['status' => 'error', 'message' => 'Security Key Missing (JWT)'], 500); } // بناء التوكن بنفس الهيكل المطلوب من V1 $payload = [ 'user_id' => $userId, // V1 يستخرج: $decoded->user_id 'iss' => 'Tripz', // V1 يتحقق: $decoded->iss === 'Tripz' 'aud' => $audience, 'iat' => time(), 'exp' => time() + 120, // زيادة الوقت قليلاً لـ 120 ثانية 'fingerPrint' => hash('sha256', ($fingerprint ?? '') . config('intaleq.fp_pepper', '')), 'jti' => bin2hex(random_bytes(16)), ]; $token = JWT::encode($payload, $secret, 'HS256'); // HMAC: يستخدم SECRET_KEY_HMAC (متوفر في .env) $hmacSecret = config('intaleq.wallet_hmac_secret'); $hmac = hash_hmac('sha256', $userId, $hmacSecret); return response()->json([ 'status' => 'success', 'token' => $token, 'hmac' => $hmac ]); } }