WebAuthn Server
Last updated
Was this helpful?
Was this helpful?
<?php
// 1. Create options for registration
$publicKeyCredentialCreationOptions = PublicKeyCredentialCreationOptions::create(
$rpEntity, // Your application
$userEntity, // The user being registered
random_bytes(32), // Challenge
// ... additional options
);
// 2. Send options to browser
// Browser calls navigator.credentials.create()
// 3. Receive and load attestation response
$publicKeyCredential = $serializer->deserialize(
$request->getContent(),
PublicKeyCredential::class,
'json'
);
// 4. Validate the response
$credentialSource = $attestationValidator->check(
$publicKeyCredential->response,
$publicKeyCredentialCreationOptions,
'https://your-domain.com'
);
// 5. Store the credential
$credentialRepository->saveCredentialSource($credentialSource);<?php
// 1. Get user's registered credentials
$credentials = $credentialRepository->findAllForUserEntity($userEntity);
$allowedCredentials = array_map(
fn($c) => $c->getPublicKeyCredentialDescriptor(),
$credentials
);
// 2. Create options for authentication
$publicKeyCredentialRequestOptions = PublicKeyCredentialRequestOptions::create(
random_bytes(32), // Challenge
allowCredentials: $allowedCredentials
);
// 3. Send options to browser
// Browser calls navigator.credentials.get()
// 4. Receive and validate assertion response
$credentialSource = $credentialRepository->findOneByCredentialId(
$publicKeyCredential->rawId
);
$updatedCredential = $assertionValidator->check(
$credentialSource,
$publicKeyCredential->response,
$publicKeyCredentialRequestOptions,
'https://your-domain.com',
$userEntity->id
);
// 5. Update credential (counter may have changed)
$credentialRepository->saveCredentialSource($updatedCredential);<?php
declare(strict_types=1);
use Webauthn\PublicKeyCredentialRpEntity;
use Webauthn\PublicKeyCredentialUserEntity;
use Webauthn\CeremonyStep\CeremonyStepManagerFactory;
use Webauthn\AuthenticatorAttestationResponseValidator;
use Webauthn\AuthenticatorAssertionResponseValidator;
// 1. Configure Relying Party
$rpEntity = PublicKeyCredentialRpEntity::create(
'ACME WebAuthn Server',
'acme.com'
);
// 2. Create validation services
$csmFactory = new CeremonyStepManagerFactory();
$creationCSM = $csmFactory->creationCeremony();
$requestCSM = $csmFactory->requestCeremony();
$attestationValidator = AuthenticatorAttestationResponseValidator::create($creationCSM);
$assertionValidator = AuthenticatorAssertionResponseValidator::create($requestCSM);
// 3. Implement repositories (use your storage backend)
$credentialRepository = new YourCredentialRepository();
$userRepository = new YourUserRepository();
// Now you can handle registration and authentication!