PHP code example of ophelios / php-webauthn-passkey
1. Go to this page and download the library: Download ophelios/php-webauthn-passkey 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/ */
ophelios / php-webauthn-passkey example snippets
namespace Models\Account\Brokers;
use Passkey\Passkey;
use Passkey\PasskeyBrokerInterface;
use stdClass;
use Zephyrus\Database\DatabaseBroker;
class PasskeyBroker extends DatabaseBroker implements PasskeyBrokerInterface
{
public function findUserIdByCredentialId(string $credentialId): ?int
{
$sql = "SELECT user_id FROM account.passkeys WHERE credential_id = ? LIMIT 1";
$row = $this->selectSingle($sql, [bin2hex($credentialId)]);
return $row?->user_id ?? null;
}
public function findByCredentialId(string $credentialId): ?stdClass
{
$sql = "SELECT * FROM account.passkeys WHERE credential_id = ? LIMIT 1";
return $this->selectSingle($sql, [bin2hex($credentialId)]);
}
public function findAllByUserId(string $userId): array
{
$sql = "SELECT * FROM account.passkeys WHERE user_id = ?";
return $this->select($sql, [$userId]);
}
public function findUserIdentity(string $userId): stdClass
{
$sql = "SELECT email, fullname AS display_name FROM account.view_user_profile WHERE id = ?";
return $this->selectSingle($sql, [$userId]);
}
public function updateUsageAndCounter(string $credentialId, int $newSignCount): void
{
$this->query("UPDATE account.passkeys
SET sign_count = ?,
last_used_at = now()
WHERE credential_id = ?", [
$newSignCount,
bin2hex($credentialId)
]);
}
public function insert(Passkey $passkey): void
{
$sql = "INSERT INTO account.passkeys (user_id, credential_id, public_key_cose, sign_count, backup_eligible, prf_salt, transports)
VALUES (?, decode(?, 'hex'), decode(?, 'hex'), ?, ?, decode(?, 'hex'), ?)";
$this->query($sql, [
$passkey->user_id,
bin2hex($passkey->credential_id),
bin2hex($passkey->public_key_cose),
$passkey->sign_count,
$passkey->backup_eligible,
bin2hex($passkey->prf_salt ?? ''),
$passkey->transports
]);
}
}
namespace Controllers\Application;
use Models\Account\Services\WebAuthnService;
use Zephyrus\Network\Response;
use Zephyrus\Network\Router\Post;
class WebAuthnController extends AppController
{
#[Post("/webauthn/register/options")]
public function options(): Response
{
$service = new PasskeyService();
return $this->json($service->options(Passport::getUserId()));
}
#[Post("/webauthn/register/verify")]
public function verify(): Response
{
$service = new PasskeyService();
return $this->json($service->verify(Passport::getUserId()));
}
}
namespace Controllers\Public;
use Controllers\Controller;
use Models\Account\Services\WebAuthnService;
use Zephyrus\Network\Response;
use Zephyrus\Network\Router\Post;
class WebAuthnController extends Controller
{
#[Post("/webauthn/login/options")]
public function options(): Response
{
$service = new WebAuthnService();
return $this->json($service->assertionOptions());
}
#[Post("/webauthn/login/verify")]
public function verify(): Response
{
$service = new WebAuthnService();
return $this->json($service->authenticate());
}
}
$service = new Passkey\PasskeyService($provider, rpName: 'Your App', enablePrf: true);