Laravel получил встроенную поддержку Passkeys

В Laravel появилась встроенная поддержка passkeys через новый пакет laravel/passkeys. Решение позволяет реализовать passwordless-аутентификацию на базе WebAuthn без сторонних пакетов и сложной ручной настройки.

Passkeys позволяют входить в приложение без пароля. Вместо него используются биометрия устройства, PIN-код или аппаратный ключ безопасности. Ключ хранится локально в менеджере паролей или системе пользователя, например в iCloud Keychain, Google Password Manager или 1Password.

Установка пакета

Для начала нужно установить серверный пакет и frontend-клиент:

composer require laravel/passkeys-server
npm install @laravel/passkeys

После установки необходимо опубликовать миграции:

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

Подключение модели User

Laravel предоставляет trait PasskeyAuthenticatable, который добавляется в модель пользователя.

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\PasskeysServer\PasskeyAuthenticatable;

class User extends Authenticatable
{
    use PasskeyAuthenticatable;
}

Trait добавляет необходимую логику для регистрации и проверки passkeys.

Регистрация passkey

Для регистрации ключа используется JavaScript-клиент @laravel/passkeys. Пример регистрации passkey:

import { register } from '@laravel/passkeys'

await register({
    user: {
        id: user.id,
        name: user.email,
    },
})

После запуска пользователь увидит системное окно создания passkey. В зависимости от устройства это может быть Face ID, Touch ID, Windows Hello или аппаратный ключ безопасности.

Аутентификация через passkey

Для входа используется метод authenticate.

import { authenticate } from '@laravel/passkeys'

await authenticate()

После успешной проверки пользователь будет авторизован без ввода пароля.

Интеграция с Fortify

Пакет поддерживает интеграцию с Laravel Fortify. Пример маршрута для входа:

Route::post('/login/passkey', function () {
    return response()->json([
        'status' => 'authenticated',
    ]);
});

Laravel автоматически обрабатывает WebAuthn challenge и верификацию ключей.

Поддержка Livewire, Blade и Inertia

Изначально passkeys в экосистеме Laravel развивались через пакет Spatie laravel-passkeys, который поддерживал Livewire и Blade-компоненты. Позже Laravel добавил собственную реализацию.

Spatie также поддерживает использование с Inertia, React и Vue через собственные action-классы.

Пример кнопки входа

Пример Blade-шаблона:

<button id="passkey-login">
    Login with Passkey
</button>

<script type="module">
    import { authenticate } from '@laravel/passkeys'

    document
        .getElementById('passkey-login')
        .addEventListener('click', async () => {
            await authenticate()
        })
</script>

Поддержка аппаратных ключей

Passkeys работают не только с биометрией устройств, но и с физическими ключами безопасности, включая YubiKey. Поддержка зависит от браузера и платформы пользователя.

WebAuthn и безопасность

Passkeys построены на стандарте WebAuthn и считаются устойчивыми к фишингу, поскольку пароль не передается серверу и не вводится вручную. Исследователи отмечают рост внедрения passkeys среди популярных сервисов и платформ.

Похожие статьи

Рекомендательные технологии Подробнее

Декодирование JSON из HTTP-ответов в Laravel

Как Laravel обрабатываются JSON-ответы HTTP-клиента и какие возможности дают флаги декодирования JSON. Рассматриваются ошибки декодирования, работа с большими числами и настройка флагов по умолчанию.

4 полезных способа использования Array.map() в JavaScript

Разбираем четыре практических способа использования метода Array.map() в JavaScript: преобразование данных, работа со строками, генерация списков и трансформация объектов.