This commit is contained in:
KANE LAZENI 2026-05-13 17:52:48 +00:00
parent 852ee5f285
commit 8a9374621f
2 changed files with 18 additions and 31 deletions

View File

@ -855,15 +855,14 @@
$.ajax({ $.ajax({
url: '/Contestation/verify_facial_api.php', url: '/Contestation/verify_facial_api.php',
method: 'POST', method: 'POST',
// contentType: 'application/json', contentType: 'application/json',
data: JSON.stringify({ data: JSON.stringify({
action: 'verify_face', action: 'verify_face',
token: verificationToken, token: verificationToken,
// image: capturedImage
image: base64Only, image: base64Only,
csrf_token: v_csrf_token csrf_token: v_csrf_token
}), }),
// dataType: 'json', dataType: 'json',
success: function(data) { success: function(data) {
if (data.success && data.match) { if (data.success && data.match) {
showSuccess(data); showSuccess(data);

View File

@ -7,7 +7,7 @@ header('Content-Type: application/json');
if ($_SERVER['REQUEST_METHOD'] !== 'POST') { if ($_SERVER['REQUEST_METHOD'] !== 'POST') {
ob_end_clean(); ob_end_clean();
echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']); echo json_encode(['success' => false, 'message' => 'Méthode non autorisée / Unauthorized method']);
exit; exit;
} }
@ -30,7 +30,7 @@ class FacialVerificationAPI {
if (!$request) { if (!$request) {
return [ return [
'success' => false, 'success' => false,
'message' => 'Lien expiré ou invalide' 'message' => 'Lien expiré ou invalide / Expired or invalid link'
]; ];
} }
@ -49,23 +49,15 @@ class FacialVerificationAPI {
error_log("Erreur validateToken: " . $e->getMessage()); error_log("Erreur validateToken: " . $e->getMessage());
return [ return [
'success' => false, 'success' => false,
'message' => 'Erreur serveur' 'message' => 'Erreur serveur / Server error'
]; ];
} }
} }
/**
* Compare deux visages avec l'API de reconnaissance faciale
* Utilisez Azure Face API, AWS Rekognition, ou une solution locale
*/
private function compareFaces($referenceImagePath, $capturedImageBase64) { private function compareFaces($referenceImagePath, $capturedImageBase64) {
//AWS Rekognition
return $this->compareWithAWSRekognition($referenceImagePath, $capturedImageBase64); return $this->compareWithAWSRekognition($referenceImagePath, $capturedImageBase64);
} }
/**
* Comparaison avec AWS Rekognition (Alternative)
*/
private function compareWithAWSRekognition($referenceImagePath, $capturedImageBase64) { private function compareWithAWSRekognition($referenceImagePath, $capturedImageBase64) {
try { try {
require_once '/var/www/Config/Faceebene.php'; require_once '/var/www/Config/Faceebene.php';
@ -84,12 +76,11 @@ class FacialVerificationAPI {
if (empty($result['FaceMatches'])) { if (empty($result['FaceMatches'])) {
$this->assure_api->resultat_traitement_face($_SESSION['numeroBeneficiaire'], '0', "Les faces ne correspondent pas! / The faces do not match!"); $this->assure_api->resultat_traitement_face($_SESSION['numeroBeneficiaire'], '0', "Les faces ne correspondent pas! / The faces do not match!");
// $this->assure_api->resultat_traitement_face($_SESSION['numeroBeneficiaire'], '0', $message);
return [ return [
'match' => false, 'match' => false,
'confidence' => 0, 'confidence' => 0,
'error' => 'Les visages ne correspondent pas / / The faces do not match!' 'error' => 'Les visages ne correspondent pas / The faces do not match!'
]; ];
} }
@ -116,9 +107,6 @@ class FacialVerificationAPI {
} }
} }
/**
* Vérifie le visage capturé
*/
public function verifyFace($token, $capturedImageBase64) { public function verifyFace($token, $capturedImageBase64) {
try { try {
// 1. Récupérer les infos de la demande // 1. Récupérer les infos de la demande
@ -128,7 +116,7 @@ class FacialVerificationAPI {
return [ return [
'success' => false, 'success' => false,
'match' => false, 'match' => false,
'message' => 'Demande expirée ou invalide' 'message' => 'Demande expirée ou invalide / Request expired or invalid'
]; ];
} }
@ -140,7 +128,7 @@ class FacialVerificationAPI {
return [ return [
'success' => false, 'success' => false,
'match' => false, 'match' => false,
'message' => 'Nombre maximum de tentatives atteint' 'message' => 'Nombre maximum de tentatives atteint / Maximum number of attempts reached'
]; ];
} }
@ -174,7 +162,7 @@ class FacialVerificationAPI {
'success' => true, 'success' => true,
'match' => true, 'match' => true,
'confidence' => $comparisonResult['confidence'], 'confidence' => $comparisonResult['confidence'],
'message' => 'Identité vérifiée avec succès', 'message' => 'Identité vérifiée avec succès / Identity successfully verified',
]; ];
} else { } else {
$attemptsRemaining = $this->maxAttempts - ($request['attempts'] + 1); $attemptsRemaining = $this->maxAttempts - ($request['attempts'] + 1);
@ -187,7 +175,7 @@ class FacialVerificationAPI {
'success' => false, 'success' => false,
'match' => false, 'match' => false,
'confidence' => $comparisonResult['confidence'], 'confidence' => $comparisonResult['confidence'],
'message' => 'Votre visage ne correspond pas', 'message' => 'Votre visage ne correspond pas / Your face does not match',
'attempts_remaining' => $attemptsRemaining 'attempts_remaining' => $attemptsRemaining
]; ];
} else { } else {
@ -198,7 +186,7 @@ class FacialVerificationAPI {
'success' => false, 'success' => false,
'match' => false, 'match' => false,
'confidence' => $comparisonResult['confidence'], 'confidence' => $comparisonResult['confidence'],
'message' => 'Vérification échouée. Nombre maximum de tentatives atteint.', 'message' => 'Vérification échouée. Nombre maximum de tentatives atteint. / Verification failed. Maximum number of attempts reached.',
'attempts_remaining' => 0 'attempts_remaining' => 0
]; ];
} }
@ -209,7 +197,7 @@ class FacialVerificationAPI {
return [ return [
'success' => false, 'success' => false,
'match' => false, 'match' => false,
'message' => 'Erreur lors de la vérification Exception : ' . $e->getMessage() 'message' => 'Erreur / Error : ' . $e->getMessage()
]; ];
} }
} }
@ -222,12 +210,12 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$csrf_token = $input['csrf_token'] ?? null; $csrf_token = $input['csrf_token'] ?? null;
if (!isset($csrf_token)) { if (!isset($csrf_token)) {
echo json_encode(['success' => false, 'message' => 'Mauvaise session! Absence']); echo json_encode(['success' => false, 'message' => 'Mauvaise session! / Bad session!']);
exit; exit;
} }
if (!Csrf::validateToken($csrf_token)) { if (!Csrf::validateToken($csrf_token)) {
echo json_encode(['success' => false, 'message' => 'Mauvaise session! No much']); echo json_encode(['success' => false, 'message' => 'Mauvaise session! / Bad session!']);
exit; exit;
} }
@ -239,7 +227,7 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
case 'validate_token': case 'validate_token':
$token = $input['token'] ?? null; $token = $input['token'] ?? null;
if (!$token) { if (!$token) {
echo json_encode(['success' => false, 'message' => 'Token requis']); echo json_encode(['success' => false, 'message' => 'Token requis / Token required']);
exit; exit;
} }
echo json_encode($api->validateToken($token)); echo json_encode($api->validateToken($token));
@ -250,16 +238,16 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$image = $input['image'] ?? null; $image = $input['image'] ?? null;
if (!$token || !$image) { if (!$token || !$image) {
echo json_encode(['success' => false, 'message' => 'Token et image requis']); echo json_encode(['success' => false, 'message' => 'Token et image requis / Token and image required']);
exit; exit;
} }
echo json_encode($api->verifyFace($token, $image)); echo json_encode($api->verifyFace($token, $image));
break; break;
default: default:
echo json_encode(['success' => false, 'message' => 'Action invalide']); echo json_encode(['success' => false, 'message' => 'Action invalide / Invalid action']);
} }
} else { } else {
ob_end_clean(); ob_end_clean();
echo json_encode(['success' => false, 'message' => 'Méthode non autorisée']); echo json_encode(['success' => false, 'message' => 'Méthode non autorisée / Unauthorized method']);
} }