2026-03-13-1
This commit is contained in:
@@ -87,54 +87,6 @@ class LoginController extends GetxController {
|
||||
update();
|
||||
}
|
||||
|
||||
getJwtWallet() async {
|
||||
try {
|
||||
if (box.read(BoxName.security_check).toString() != 'passed') {
|
||||
Log.print('Security check failed');
|
||||
return;
|
||||
}
|
||||
Log.print('Security check passed');
|
||||
|
||||
String fingerPrint = await DeviceHelper.getDeviceFingerprint();
|
||||
final dev = GetPlatform.isAndroid ? 'android' : 'ios';
|
||||
|
||||
var payload = {
|
||||
'id': box.read(BoxName.passengerID),
|
||||
'password': AK.passnpassenger,
|
||||
'aud': '${AK.allowed}$dev',
|
||||
'fingerPrint': fingerPrint,
|
||||
};
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse(AppLink.loginJwtWalletRider),
|
||||
body: payload,
|
||||
);
|
||||
|
||||
// Handle bad responses
|
||||
if (response.statusCode != 200) {
|
||||
_showJwtErrorDialog(
|
||||
"حدث خطأ أثناء الاتصال بالخادم. يرجى المحاولة مرة أخرى.");
|
||||
throw Exception("JWT request failed");
|
||||
}
|
||||
|
||||
var data = jsonDecode(response.body);
|
||||
|
||||
// Validate JWT response structure
|
||||
if (!data.containsKey('jwt') || !data.containsKey('hmac')) {
|
||||
_showJwtErrorDialog("تعذّر التحقق من الأمان. يرجى إعادة المحاولة.");
|
||||
throw Exception("Invalid JWT response format");
|
||||
}
|
||||
|
||||
// Save HMAC locally
|
||||
await box.write(BoxName.hmac, data['hmac']);
|
||||
|
||||
return data['jwt'].toString();
|
||||
} catch (e) {
|
||||
_showJwtErrorDialog("حدث خلل غير متوقع. يرجى المحاولة مرة أخرى.");
|
||||
rethrow;
|
||||
}
|
||||
}
|
||||
|
||||
void _showJwtErrorDialog(String message) {
|
||||
if (Get.context == null) return;
|
||||
|
||||
@@ -149,72 +101,128 @@ class LoginController extends GetxController {
|
||||
},
|
||||
);
|
||||
}
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
// LoginController — دوال إدارة الـ JWT
|
||||
// ───────────────────────────────────────────────────────────────
|
||||
// لا تغيير على اسم الكلاس أو أسماء الدوال
|
||||
// ═══════════════════════════════════════════════════════════════
|
||||
|
||||
getJWT() async {
|
||||
// print(Pasenger.pasengerpas);
|
||||
// await SecurityHelper.performSecurityChecks();
|
||||
Log.print('firstTimeLoadKey: ${box.read(BoxName.firstTimeLoadKey)}');
|
||||
// داخل class LoginController
|
||||
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
// getJWT: الحصول على توكن للراكب
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
// المنطق:
|
||||
// • firstTimeLoadKey != false ← أول مرة يفتح التطبيق → loginFirstTime
|
||||
// • firstTimeLoadKey == false ← مستخدم موجود → loginJwtRider
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
Future<void> getJWT() async {
|
||||
dev = Platform.isAndroid ? 'android' : 'ios';
|
||||
|
||||
// تأكد إن البصمة محدّثة قبل أي طلب
|
||||
await DeviceHelper.getDeviceFingerprint();
|
||||
final String fp = box.read(BoxName.deviceFpEncrypted) ?? '';
|
||||
|
||||
if (box.read(BoxName.firstTimeLoadKey).toString() != 'false') {
|
||||
// ── أول تسجيل ─────────────────────────────────────────
|
||||
// نرسل البصمة المشفرة مع باقي البيانات
|
||||
// السيرفر سيعمل hash لها ويخزنها في JWT payload
|
||||
var payload = {
|
||||
'id': box.read(BoxName.passengerID) ?? AK.newId,
|
||||
'password': AK.passnpassenger,
|
||||
'aud': '${AK.allowed}$dev',
|
||||
'fingerPrint': fp,
|
||||
};
|
||||
// Log.print('payload: ${payload}');
|
||||
var response0 = await http.post(
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse(AppLink.loginFirstTime),
|
||||
body: payload,
|
||||
);
|
||||
if (response0.statusCode == 200) {
|
||||
final decodedResponse1 = jsonDecode(response0.body);
|
||||
Log.print('AppLink.loginFirstTime: ${AppLink.loginFirstTime}');
|
||||
|
||||
final jwt = decodedResponse1['jwt'];
|
||||
final refreshToken = decodedResponse1['refresh_token'];
|
||||
Log.print('payload: ${payload}');
|
||||
Log.print('response: ${response}');
|
||||
|
||||
if (response.statusCode == 200) {
|
||||
final decoded = jsonDecode(response.body);
|
||||
final String jwt = decoded['jwt'];
|
||||
|
||||
// نشفر الـ JWT بالتشفير الثلاثي قبل التخزين في GetStorage
|
||||
box.write(BoxName.jwt, c(jwt));
|
||||
// Sss.write(BoxName.jwt, jwt);
|
||||
await storage.write(key: BoxName.refreshToken, value: refreshToken);
|
||||
|
||||
// await AppInitializer().getAIKey(Pasenger.keyOfApp);
|
||||
// await AppInitializer().getAIKey(Pasenger.initializationVector);
|
||||
// await Future.delayed(Duration.zero);
|
||||
await EncryptionHelper.initialize();
|
||||
|
||||
await AppInitializer().getKey();
|
||||
} else {}
|
||||
}
|
||||
} else {
|
||||
// ── مستخدم موجود: تجديد التوكن ────────────────────────
|
||||
await EncryptionHelper.initialize();
|
||||
|
||||
var payload = {
|
||||
'id': box.read(BoxName.passengerID),
|
||||
'password': box.read(BoxName.email),
|
||||
'fingerPrint': fp,
|
||||
'aud': '${AK.allowed}$dev',
|
||||
};
|
||||
// Log.print('payload: ${payload}');
|
||||
var response1 = await http.post(
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse(AppLink.loginJwtRider),
|
||||
body: payload,
|
||||
);
|
||||
Log.print('req: ${response1.request}');
|
||||
Log.print('response: ${response1.body}');
|
||||
Log.print('AppLink.loginJwtRider: ${AppLink.loginJwtRider}');
|
||||
|
||||
Log.print('payload: ${payload}');
|
||||
// Log.print('decodedResponse1: ${jsonDecode(response1.body)}');
|
||||
Log.print('response: ${response.body}');
|
||||
if (response.statusCode == 200) {
|
||||
final decoded = jsonDecode(response.body);
|
||||
final String jwt = decoded['jwt'];
|
||||
|
||||
if (response1.statusCode == 200) {
|
||||
final decodedResponse1 = jsonDecode(response1.body);
|
||||
// Log.print('decodedResponse1: ${decodedResponse1}');
|
||||
|
||||
final jwt = decodedResponse1['jwt'];
|
||||
await box.write(BoxName.jwt, c(jwt));
|
||||
|
||||
await AppInitializer().getKey();
|
||||
|
||||
// final refreshToken = decodedResponse1['refresh_token'];
|
||||
// await storage.write(key: BoxName.refreshToken, value: refreshToken);
|
||||
box.write(BoxName.jwt, c(jwt));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
// getJwtWallet: الحصول على توكن لسيرفر المدفوعات
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
// الفرق عن getJWT:
|
||||
// • يستخدم endpoint مختلف (loginWallet)
|
||||
// • يرجع hmac مع الـ jwt ويخزنه في GetStorage
|
||||
// • الـ JWT لا يُشفَّر ثلاثياً (يُستخدم مباشرة في الـ header)
|
||||
// ─────────────────────────────────────────────────────────────
|
||||
Future<String?> getJwtWallet() async {
|
||||
dev = Platform.isAndroid ? 'android' : 'ios';
|
||||
|
||||
// await DeviceHelper.initAndStore();
|
||||
final String fp = box.read(BoxName.deviceFpEncrypted) ?? '';
|
||||
|
||||
var payload = {
|
||||
'id': box.read(BoxName.passengerID),
|
||||
'password': AK.passnpassenger,
|
||||
'aud': '${AK.allowed}$dev',
|
||||
'fingerPrint': fp,
|
||||
};
|
||||
|
||||
var response = await http.post(
|
||||
Uri.parse(AppLink.loginJwtWalletRider),
|
||||
body: payload,
|
||||
);
|
||||
Log.print('AppLink.loginJwtWalletRider: ${AppLink.loginJwtWalletRider}');
|
||||
|
||||
// Log.print('payload: ${payload}');
|
||||
Log.print('response wallet: ${response.body}');
|
||||
if (response.statusCode == 200) {
|
||||
final decoded = jsonDecode(response.body);
|
||||
final String jwt = decoded['jwt'];
|
||||
final String hmac = decoded['hmac'];
|
||||
|
||||
// نخزن الـ hmac للاستخدام في X-HMAC-Auth header
|
||||
box.write(BoxName.hmac, hmac);
|
||||
|
||||
// wallet JWT يُرجَع مباشرة دون تشفير ثلاثي
|
||||
return jwt;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
Future<void> loginUsingCredentials(String passengerID, String email) async {
|
||||
isloading = true;
|
||||
update();
|
||||
|
||||
@@ -297,20 +297,6 @@ class RegisterController extends GetxController {
|
||||
);
|
||||
|
||||
if (res1 != 'failure') {
|
||||
// if (AppLink.IntaleqAlexandriaServer != AppLink.IntaleqSyriaServer) {
|
||||
// List<Future> signUp = [
|
||||
// CRUD().post(
|
||||
// link: '${AppLink.IntaleqAlexandriaServer}/auth/signup.php',
|
||||
// payload: payload,
|
||||
// ),
|
||||
// CRUD().post(
|
||||
// link: '${AppLink.IntaleqGizaServer}/auth/signup.php',
|
||||
// payload: payload,
|
||||
// )
|
||||
// ];
|
||||
// await Future.wait(signUp);
|
||||
// }
|
||||
|
||||
box.write(BoxName.isVerified, '1');
|
||||
box.write(BoxName.isFirstTime, '0');
|
||||
box.write(BoxName.phone, (phoneController.text));
|
||||
|
||||
Reference in New Issue
Block a user