Alllplmpliedl manual JWT check and restored all driver fields68j2

This commit is contained in:
Hamza-Ayed
2026-04-26 02:14:16 +03:00
parent 6d65f4d09f
commit cc088decfd
3 changed files with 167 additions and 19 deletions

View File

@@ -5,15 +5,24 @@ namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Firebase\JWT\JWT;
use Illuminate\Support\Facades\File;
/**
* PaymentTokenController — توليد رموز الدفع المتوافقة مع سيرفر المحفظة V1
*
* ⚠️ مهم جداً:
* سيرفر المحفظة (walletintaleq.intaleq.xyz) يعمل بكود V1 ويتحقق من التوكن باستخدام:
* - المفتاح: /home/intaleq-api/.secret_key (وليس PAYMENT_INTERNAL_KEY_PATH)
* - الـ Issuer: 'Tripz' أو 'Tripz-Wallet'
* - الـ Claim: user_id (وليس sub)
*
* لذلك يجب أن يكون التوكن المُولّد هنا متوافقاً تماماً مع V1.
*/
class PaymentTokenController extends Controller
{
// 1. مسار الراكب
public function generatePassengerToken(Request $request)
{
$userId = $request->attributes->get('_jwt_user_id');
// تحقق خاص بالراكب (لا يوجد بصمة سيارة مثلاً)
return $this->buildToken($userId, 'android/ios_passenger', $request->input('fingerPrint'));
}
@@ -21,7 +30,6 @@ class PaymentTokenController extends Controller
public function generateDriverToken(Request $request)
{
$userId = $request->attributes->get('_jwt_user_id');
// تحقق خاص بالسائق (ضرورة وجود بصمة جهاز قوية)
return $this->buildToken($userId, 'android/ios_driver', $request->input('fingerPrint'));
}
@@ -29,36 +37,43 @@ class PaymentTokenController extends Controller
public function generateAdminToken(Request $request)
{
$userId = $request->attributes->get('_jwt_user_id');
// المدراء لديهم صلاحيات أوسع، قد يكون الـ aud مختلفاً
return $this->buildToken($userId, 'web_admin', 'admin_secure_context');
}
// 4. دالة البناء المركزية (Private)
// 4. دالة البناء المركزية — متوافقة مع V1 authenticateJWT()
private function buildToken($userId, $audience, $fingerprint)
{
$keyPath = env('PAYMENT_INTERNAL_KEY_PATH');
// ⚠️ مهم جداً لموافاة V1:
// سيرفر المحفظة (walletintaleq.intaleq.xyz) يستخدم V1authenticateJWT()
// التي تقرأ المفتاح من: /home/intaleq-api/.secret_key
// لذلك يجب استخدام jwt_secret هنا وليس wallet_jwt_secret.
$secret = config('intaleq.jwt_secret');
if (!File::exists($keyPath)) {
return response()->json(['status' => 'error', 'message' => 'Security Key Missing'], 500);
if (empty($secret)) {
return response()->json(['status' => 'error', 'message' => 'Security Key Missing (JWT)'], 500);
}
$internalSecret = trim(File::get($keyPath));
// بناء التوكن بنفس الهيكل المطلوب من V1
$payload = [
'iss' => 'Intaleq_V2',
'sub' => $userId,
'aud' => $audience,
'iat' => time(),
'exp' => time() + 60,
'fingerprint' => $fingerprint
'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, $internalSecret, 'HS256');
$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' => hash_hmac('sha256', $token, $internalSecret)
'token' => $token,
'hmac' => $hmac
]);
}
}