spatie/laravel-passkeys
Add passkey (WebAuthn) login to your Laravel app. Provides a Livewire component to create and manage passkeys and a Blade component to authenticate users without passwords, using platform authenticators like iCloud Keychain or 1Password.
Pros:
webauthn-lib (v5.3+), adhering to FIDO2/CTAP2 standards for passkey authentication.PasskeyRegisteredEvent, allowing integration with analytics, notifications, or audit logs.remember_me, session management).Cons:
passkeys table (migration provided). Assumes a users table with id and email fields.webauthn-lib (v5.3+), PHP 8.1+.Authenticatable or custom guards (e.g., Sanctum, Passport).relyingParty name, allowedOrigins) can break passkey enrollment/auth. Requires testing with real devices (e.g., iOS/Android).PasskeyRegisteredEvent) may need adaptation for existing event handlers.allowedOrigins and relyingParty names aligned with your domain/subdomains?/passkey/authenticate)?PasskeyRegisteredEvent be extended?Preparation:
LoginController, RegisterController).Installation:
composer require spatie/laravel-passkeys
php artisan vendor:publish --provider="Spatie\Passkeys\PasskeysServiceProvider"
php artisan migrate
config/passkeys.php) to customize:
relying_party.name (e.g., "Acme Corp").allowed_origins (e.g., ["https://app.acme.com", "https://*.acme.com"]).authentication_options (e.g., remember_me: true).Frontend Integration:
routes/web.php:
Route::get('/passkey/register', PasskeyRegister::class)->name('passkey.register');
@passkeyAuth in login forms:
@passkeyAuth
Backend Logic:
AuthenticatesUsers or MustVerifyEmail to handle passkey auth:
use Spatie\Passkeys\AuthenticatesWithPasskeys;
class LoginController extends Controller {
use AuthenticatesUsers, AuthenticatesWithPasskeys;
}
PasskeyRegisteredEvent) for analytics:
PasskeyRegistered::listen(function ($user, $passkey) {
event(new UserPasskeyAdded($user, $passkey));
});
Testing:
LoginController with custom logic.webauthn-lib compatibility fixes).webauthn-lib updates may require config tweaks (e.g., CredentialRecord changes in v5.3).NotAllowedError) are opaque without browser dev tools.passkeys table.allowedOrigins (CORS errors).How can I help you explore Laravel packages today?