Saltar al contenido principal
Este artículo es una investigación inicial basada en los README de laravel/passkeys-server y laravel/passkeys. Ambos paquetes se encuentran en fase de desarrollo sin tags (a fecha de abril de 2026).

¿Qué son estos paquetes?

En repositorios oficiales de Laravel se han publicado dos paquetes para implementar autenticación sin contraseña (WebAuthn / passkeys). Combinándolos, puedes implementar de forma coherente en una app Laravel el registro y el login con passkeys.

Lado servidor: laravel/passkeys-server

Instalación y configuración inicial

1

Añade el paquete PHP

composer require laravel/passkeys
2

Publica y ejecuta las migraciones

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

Añade el trait y el contract al modelo User

use Laravel\Passkeys\Contracts\PasskeyUser;
use Laravel\Passkeys\PasskeyAuthenticatable;

class User extends Authenticatable implements PasskeyUser
{
    use PasskeyAuthenticatable;
}
Si lo necesitas, también puedes publicar el archivo de configuración.
php artisan vendor:publish --tag=passkeys-config

Rutas registradas automáticamente

CategoríaMétodoRutaRol
Login (guest)GET/passkeys/login/optionsObtiene las opciones de autenticación
Login (guest)POST/passkeys/loginVerifica la passkey e inicia sesión
Confirm (auth)GET/passkeys/confirm/optionsObtiene las opciones de confirmación
Confirm (auth)POST/passkeys/confirmConfirmación con passkey
Management (auth)GET/user/passkeys/optionsObtiene las opciones de registro
Management (auth)POST/user/passkeysGuarda una nueva passkey
Management (auth)DELETE/user/passkeys/{passkey}Elimina una passkey

Principales opciones de config/passkeys.php

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

Eventos

El paquete dispara los siguientes eventos.
  • PasskeyRegistered
  • PasskeyVerified
  • PasskeyDeleted

Puntos de personalización

Con Passkeys::authorizeLoginUsing() puedes controlar la autorización de login tras una verificación exitosa. Si quieres detenerla, devuelve false o lanza una ValidationException.
Puedes extender GenerateRegistrationOptions / GenerateVerificationOptions / StorePasskey / VerifyPasskey / DeletePasskey, enlazarlos en el service container y sustituir el comportamiento.
Implementa por tu cuenta contratos como PasskeyLoginResponse para adaptar la respuesta en caso de éxito (JSON, redirect, etc.) a los requisitos de tu app.

Lado cliente: @laravel/passkeys

@laravel/passkeys es un cliente JavaScript que maneja la ceremonia WebAuthn del lado del navegador.

Instalación

npm install @laravel/passkeys

API básica

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

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

Helpers por framework

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

Autocompletado de passkeys

Al indicar autofill: true, en los inputs que tengan autocomplete="... webauthn" se puede mostrar el selector de passkeys del navegador. En entornos no soportados o si el usuario cancela, cae al flujo normal.

Errores tipados

En el README se publican las siguientes clases de error.
  • NotSupportedError
  • UserCancelledError
  • PasskeyExistsError
  • PasskeyError (clase base)

Soporte SSR

WebAuthn es una API del navegador, pero los hooks de cada framework son SSR-safe. En el lado servidor isSupported se trata como false y, tras el mount, se actualiza al estado real del navegador.

Conclusión

  • Combinando laravel/passkeys-server (PHP) y @laravel/passkeys (JS), se puede construir en Laravel una stack de autenticación con passkeys completa.
  • Ambos están en fase de desarrollo sin tags, pero, como ecosistema oficial de Laravel, existe una alta probabilidad de que se conviertan en el método de autenticación estándar en el futuro.
  • Si vas a adoptarlo pronto, es prudente diseñar teniendo como referencia las rutas, la configuración, el manejo de errores y los puntos de extensibilidad del README.
Posteriormente, passkeys se ha añadido oficialmente como funcionalidad de Laravel Fortify. Si activas las passkeys vía Fortify, en lugar de instalar directamente laravel/passkeys-server, usa Features::passkeys(). Consulta los detalles en Laravel Fortify y los starter kits.

laravel/passkeys-server

Consulta el README más reciente y la implementación del paquete del lado servidor.

@laravel/passkeys

Consulta el README más reciente y la API del paquete del lado cliente.

Laravel Fortify y los starter kits

Se explican el procedimiento para activar passkeys vía Fortify y la relación con los starter kits.
Última modificación el 13 de julio de 2026