| 
<?phprequire '../vendor/autoload.php';
 
 use Webauthn\PublicKeyCredentialLoader;
 use Webauthn\AuthenticatorAssertionResponseValidator;
 use Webauthn\PublicKeyCredentialSourceRepository;
 use Webauthn\PublicKeyCredentialSource;
 use Webauthn\PublicKeyCredentialUserEntity;
 
 
 header('Content-Type: application/json');
 require_once '../backend/controller/UsuarioController.php';
 require_once '../backend/model/Usuario.php';
 require_once '../backend/config/Database.php';
 
 $data = json_decode(file_get_contents('php://input'), true);
 
 $id = $data['username'];
 $clientDataJSON = base64_decode($data['clientDataJSON']);
 $authenticatorData = base64_decode($data['authenticatorData']);
 $signature = base64_decode($data['signature']);
 
 $db = new Database();
 $usuario = new Usuario();
 $controller = new UsuarioController($db,$usuario);
 $user = $controller->getByUsername($id);
 $credential=json_decode($user,true);
 
 
 
 $publicKeyCredentialSource = new PublicKeyCredentialSource(
 $credential['credId'],
 PublicKeyCredentialSource::USER_HANDLE_TYPE_PUBLIC,
 [],
 'localhost',
 new PublicKeyCredentialUserEntity($id, $id, $id),
 '', // AAGUID, this needs to be the correct AAGUID of your authenticator
 base64_decode($credential['attestationObject']), // Public key of the user
 'none',
 0
 );
 
 $publicKeyCredentialSourceRepository = new class($publicKeyCredentialSource) implements PublicKeyCredentialSourceRepository {
 private $publicKeyCredentialSource;
 
 public function __construct(PublicKeyCredentialSource $publicKeyCredentialSource) {
 $this->publicKeyCredentialSource = $publicKeyCredentialSource;
 }
 
 public function findOneByCredentialId(string $publicKeyCredentialId): ?PublicKeyCredentialSource {
 return $this->publicKeyCredentialSource;
 }
 
 public function findAllForUserEntity(PublicKeyCredentialUserEntity $publicKeyCredentialUserEntity): array {
 return [$this->publicKeyCredentialSource];
 }
 
 public function saveCredentialSource(PublicKeyCredentialSource $publicKeyCredentialSource): void {
 $this->publicKeyCredentialSource = $publicKeyCredentialSource;
 }
 };
 
 $publicKeyCredentialLoader = new PublicKeyCredentialLoader($publicKeyCredentialSourceRepository);
 $publicKeyCredential = $publicKeyCredentialLoader->load(base64_encode($data['rawId']));
 $authenticatorAssertionResponse = $publicKeyCredential->getResponse();
 
 $authenticatorAssertionResponseValidator = new AuthenticatorAssertionResponseValidator($publicKeyCredentialSourceRepository);
 
 try {
 $publicKeyCredentialCreationOptions = $credential['attestationObject']; // this needs to be the PublicKeyCredentialCreationOptions from the registration
 $authenticatorAssertionResponseValidator->check(
 $authenticatorAssertionResponse,
 $publicKeyCredentialCreationOptions,
 $clientDataJSON,
 $publicKeyCredentialSource->getUserHandle(),
 $publicKeyCredentialSource->getAaguid()
 );
 
 http_response_code(200);
 echo json_encode(['status' => 'success']);
 } catch (Exception $e) {
 http_response_code(400);
 echo json_encode(['status' => 'failure', 'message' => 'Invalid signature', 'error' => $e->getMessage()]);
 }
 ?>
 
 |