1. Go to this page and download the library: Download jbtronics/2fa-webauthn library. Choose the download type require.
2. Extract the ZIP file and open the index.php.
3. Add this code to the index.php.
<?php
require_once('vendor/autoload.php');
/* Start to develop here. Best regards https://php-download.com/ */
jbtronics / 2fa-webauthn example snippets
use Jbtronics\TFAWebauthn\Model\TwoFactorInterface as WebauthnTwoFactorInterface;
class User implements WebauthnTwoFactorInterface
{
/**
* @var Collection<int, PublicKeyCredentialSource>
* @ORM\OneToMany(targetEntity="App\Entity\WebauthnKey", mappedBy="user", cascade={"REMOVE"}, orphanRemoval=true)
*/
private $webauthnKeys;
/**
* Determines whether the user has 2FA using Webauthn enabled
* @return bool True if the webauthn 2FA is enabled, false otherwise
*/
public function isWebAuthnAuthenticatorEnabled(): bool
{
//Return true to enable webauthn 2FA
return count($this->webauthnKeys) > 0;
}
/**
* Returns a list of all legacy U2F keys, associated with this user
* Return an empty array, if this user does not have any legacy U2F keys.
* @return iterable<LegacyU2FKeyInterface>
*/
public function getLegacyU2FKeys(): iterable
{
return []; //If you have no legacy U2F keys, return just an empty array
//return $this->u2f_keys; //Otherwise return the legacy keys (see migration section below)
}
/**
* Returns a list of all webauthn keys, associated with this user
* @return iterable<PublicKeyCredentialSource>
*/
public function getWebauthnKeys(): iterable
{
return $this->webauthnKeys;
}
/**
* Returns the webauthn user entity that should be used for this user.
* @return PublicKeyCredentialUserEntity
*/
public function getWebAuthnUser(): PublicKeyCredentialUserEntity
{
//Return webauthn user definition for this user. As we just use it as an two-factor authentication, the values here are most likely not that important
return new PublicKeyCredentialUserEntity(
$this->getUsername(), // The Webauthn Name (like a username)
$this->getID(), // A unique identifier for this user
$this->getDisplayName() // The display name of this user (optional, otherwise null)
);
}
}
declare(strict_types=1);
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource;
#[ORM\Entity]
#[ORM\Table(name: 'webauthn_keys')]
class WebAuthnKey extends BasePublicKeyCredentialSource
{
#[ORM\Id]
#[ORM\Column(type: Types::INTEGER)]
#[ORM\GeneratedValue]
private $id;
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'webauthn_keys')]
protected ?User $user = null;
//You can declare additional fields too, if you want to store additional information about the key (like a name)
private $name;
public function getId(): string
{
return $this->id;
}
public static function fromRegistration(BasePublicKeyCredentialSource $registration): self
{
return new self(
publicKeyCredentialId: $registration->publicKeyCredentialId,
type: $registration->type,
transports: $registration->transports,
attestationType: $registration->attestationType,
trustPath: $registration->trustPath,
aaguid: $registration->aaguid,
credentialPublicKey: $registration->credentialPublicKey,
userHandle: $registration->userHandle,
counter: $registration->counter,
otherUI: $registration->otherUI,
backupEligible: $registration->backupEligible,
backupStatus: $registration->backupStatus,
uvInitialized: $registration->uvInitialized,
);
}
}
use Jbtronics\TFAWebauthn\Services\TFAWebauthnRegistrationHelper;Ä
class WebauthnKeyRegistrationController extends AbstractController
{
/**
* @Route("/webauthn/register", name="webauthn_register")
*/
public function register(Request $request, TFAWebauthnRegistrationHelper $registrationHelper, EntityManagerInterface $em)
{
//If form was submitted, check the auth response
if ($request->getMethod() === 'POST') {
$webauthnResponse = $request->request->get('_auth_code');
//Retrieve other data from the form, that you want to store with the key
$keyName = $request->request->get('keyName');
try {
//Check the response
$new_key = $registrationHelper->checkRegistrationResponse($webauthnResponse);
} catch (Exception $exception) {
// Handle errors...
}
//If we got here, the registration was successful. Now we can store the new key in the database
//Convert our returned key into an database entity and persist it...
$keyEntity = WebauthnKey::fromRegistration($new_key);
$keyEntity->setName($keyName);
$keyEntity->setUser($this->getUser());
$em->persist($keyEntity);
$em->flush();
$this->addFlash('success', 'Key registered successfully');
//We are finished here so return to another page
return $this->redirectToRoute('homepage');
}
return $this->render(
'webauthn_register.html.twig',
[
//Generate the registration request
'registrationRequest' => $registrationHelper->generateRegistrationRequestAsJSON(),
]
);
}
}
Loading please wait ...
Before you can download the PHP files, the dependencies should be resolved. This can take some minutes. Please be patient.