Skip to main content

Documentation Index

Fetch the complete documentation index at: https://kawax.biz/llms.txt

Use this file to discover all available pages before exploring further.

This article is based on the official README files of laravel/passkeys-server and laravel/passkeys. Both packages are still pre-tag and under active development (as of April 2026).

What these packages are

Laravel has published two official repositories for passwordless authentication with WebAuthn/passkeys: Together, they provide an end-to-end passkey authentication flow for Laravel applications.

Server side package: laravel/passkeys-server

Installation and initial setup

1

Install the PHP package

composer require laravel/passkeys
2

Publish and run migrations

php artisan vendor:publish --tag=passkeys-migrations
php artisan migrate
3

Update your User model

Add the PasskeyAuthenticatable trait and implement the PasskeyUser contract.
use Laravel\Passkeys\Contracts\PasskeyUser;
use Laravel\Passkeys\PasskeyAuthenticatable;

class User extends Authenticatable implements PasskeyUser
{
    use PasskeyAuthenticatable;
}
If you want to customize defaults, publish the config:
php artisan vendor:publish --tag=passkeys-config

Auto-registered routes

AreaMethodRoutePurpose
Login (guest)GET/passkeys/login/optionsGet verification options
Login (guest)POST/passkeys/loginVerify credential and sign in
Confirmation (auth)GET/passkeys/confirm/optionsGet confirmation options
Confirmation (auth)POST/passkeys/confirmVerify passkey for confirmation
Management (auth)GET/user/passkeys/optionsGet registration options
Management (auth)POST/user/passkeysStore a new passkey
Management (auth)DELETE/user/passkeys/{passkey}Delete an existing passkey

Key options in config/passkeys.php

  • relying_party_id
  • allowed_origins
  • user_handle_secret
  • timeout
  • guard
  • middleware
  • throttle
  • redirect

Events

The package emits:
  • PasskeyRegistered
  • PasskeyVerified
  • PasskeyDeleted

Customization points

Use Passkeys::authorizeLoginUsing() to block or allow login after a successful passkey assertion. You can return false or throw ValidationException for custom validation messages.
You can extend and bind action classes such as GenerateRegistrationOptions, GenerateVerificationOptions, StorePasskey, VerifyPasskey, and DeletePasskey.
You can bind response contracts like PasskeyLoginResponse to return your own JSON payloads or redirects after passkey operations.

Browser package: @laravel/passkeys

@laravel/passkeys is the JavaScript client that runs WebAuthn ceremonies in the browser.

Installation

npm install @laravel/passkeys

Core API

import { Passkeys } from "@laravel/passkeys";

await Passkeys.register({ name: "My MacBook" });
await Passkeys.verify();

Framework helpers

  • React: usePasskeyVerify, usePasskeyRegister from @laravel/passkeys/react
  • Vue: usePasskeyVerify, usePasskeyRegister from @laravel/passkeys/vue
  • Svelte: usePasskeyVerify, usePasskeyRegister from @laravel/passkeys/svelte

Passkey autofill

With autofill: true, the client asks the browser to show saved passkeys in a credential picker attached to an input that includes the webauthn autocomplete token.

Typed error classes

The README documents these typed errors:
  • NotSupportedError
  • UserCancelledError
  • PasskeyExistsError
  • PasskeyError (base class)

SSR support

WebAuthn is browser-only, but the framework hooks are SSR-safe. During SSR, isSupported is false, then it updates after mount on the client.

Summary

  • laravel/passkeys-server and @laravel/passkeys together form a complete passkey authentication stack for Laravel.
  • Both are still early-stage (no tags yet), but they strongly indicate official ecosystem-level passkey support.
  • The architecture is Laravel-native end to end: routes, middleware/guards, actions/responses, and typed frontend integration.

laravel/passkeys-server

Read the latest server-side README and source code directly in the official repository.

@laravel/passkeys

Read the latest browser client README and framework helper APIs.
Last modified on April 23, 2026