> ## Documentation Index
> Fetch the complete documentation index at: https://kawax.biz/llms.txt
> Use this file to discover all available pages before exploring further.

# Laravel Fortify en de starter kits

> Uitleg over het interne ontwerp van Laravel Fortify, de frontend-onafhankelijke authenticatiebackend. Waarom de huidige starter kits Fortify gebruiken, de configuratie van de FortifyServiceProvider en het inschakelen van 2FA en passkeys.

## Wat is Fortify?

[Laravel Fortify](https://github.com/laravel/fortify) is een frontend-onafhankelijke implementatie van een authenticatiebackend. Het biedt alle routes en controllers die nodig zijn voor inloggen, registreren, wachtwoordherstel, e-mailverificatie, 2FA en passkeys.

<Info>
  Fortify heeft geen UI. Het werkt doordat starter kits of je eigen UI requests sturen naar de routes van Fortify.
</Info>

De ontwerpfilosofie van "frontend-onafhankelijkheid" is belangrijk. Of het nu Blade, Inertia (React/Vue/Svelte) of een API is: dezelfde authenticatiebackend is met elke frontendstack herbruikbaar. Dat is de reden dat Fortify al zo lang wordt gebruikt.

## Geschiedenis: van Jetstream tot de huidige starter kits

```mermaid theme={null}
timeline
    title De ontwikkeling van Fortify
    2020 Laravel 8 : Verschijnt tegelijk met Jetstream
               : Fortify wordt automatisch geïnstalleerd als motor achter Jetstream
    2020 Laravel 8 : Breeze verschijnt (zonder Fortify)
               : Zelfstandig als simpele authenticatiescaffold
    2025 Vernieuwing starter kits : React/Vue starter kits hebben 2FA-ondersteuning nodig
                         : Fortify opnieuw geadopteerd → hele authenticatie op Fortify-basis
    2026 Passkey-ondersteuning : Passkeys-functionaliteit toegevoegd aan Fortify
```

### Waarom gebruiken de huidige starter kits nog steeds Fortify?

De oorspronkelijke React/Vue starter kits waren geïmplementeerd zonder Fortify. Maar **toen ondersteuning voor tweefactorauthenticatie (2FA) nodig werd, is Fortify direct geadopteerd**, waardoor de hele authenticatie is overgegaan op een Fortify-basis.

Omdat Fortify is ontworpen als "frontend-onafhankelijk", past het goed bij starter kits die Inertia gebruiken, en wordt het nog steeds gebruikt.

<Info>
  Fortify is momenteel het langst gebruikte officiële authenticatiepackage van Laravel. Sinds de introductie in 2020 is het actief gebleven, in wisselende vorm: van Jetstream tot de huidige starter kits.
</Info>

## Opbouw van de huidige starter kits

In de React/Vue starter kits wordt Fortify geconfigureerd in de volgende bestanden:

* `app/Providers/FortifyServiceProvider.php` — registratie van views, actions en rate limiting
* `config/fortify.php` — de in te schakelen functies en authenticatie-instellingen

### De belangrijkste instellingen in `config/fortify.php`

```php theme={null}
use Laravel\Fortify\Features;

return [
    'guard'    => 'web',
    'username' => 'email',
    'home'     => '/dashboard',

    'limiters' => [
        'login'      => 'login',
        'two-factor' => 'two-factor',
    ],

    'features' => [
        Features::registration(),
        Features::resetPasswords(),
        Features::emailVerification(),
        Features::twoFactorAuthentication([
            'confirm'         => true,
            'confirmPassword' => true,
        ]),
    ],
];
```

In de starter kits zijn passkeys (`Features::passkeys()`) standaard niet ingeschakeld. Om ze in te schakelen voeg je ze toe aan de `features`-array.

## Configuratie van de `FortifyServiceProvider`

De `FortifyServiceProvider` van de starter kits vervult drie rollen.

### 1. Configuratie van actions

```php theme={null}
private function configureActions(): void
{
    Fortify::resetUserPasswordsUsing(ResetUserPassword::class);
    Fortify::createUsersUsing(CreateNewUser::class);
}
```

Met de klassen in `app/Actions/Fortify/` pas je de logica voor het aanmaken van gebruikers en wachtwoordherstel aan. Validatie en hashing zijn hier gebundeld.

### 2. Configuratie van views

```php theme={null}
private function configureViews(): void
{
    Fortify::loginView(fn (Request $request) => Inertia::render('auth/login', [
        'canResetPassword' => Features::enabled(Features::resetPasswords()),
        'canRegister'      => Features::enabled(Features::registration()),
        'status'           => $request->session()->get('status'),
    ]));

    Fortify::resetPasswordView(fn (Request $request) => Inertia::render('auth/reset-password', [
        'email' => $request->email,
        'token' => $request->route('token'),
    ]));

    Fortify::requestPasswordResetLinkView(
        fn (Request $request) => Inertia::render('auth/forgot-password', [
            'status' => $request->session()->get('status'),
        ])
    );

    Fortify::verifyEmailView(
        fn (Request $request) => Inertia::render('auth/verify-email', [
            'status' => $request->session()->get('status'),
        ])
    );

    Fortify::registerView(fn () => Inertia::render('auth/register'));

    Fortify::twoFactorChallengeView(fn () => Inertia::render('auth/two-factor-challenge'));

    Fortify::confirmPasswordView(fn () => Inertia::render('auth/confirm-password'));
}
```

Elke viewmethode ontvangt een closure die een Inertia-component teruggeeft. Het punt om te onthouden: met `Features::enabled()` worden de feature flags gecontroleerd en aan de view doorgegeven.

<Info>
  In een Blade-app geef je in plaats van `Inertia::render(...)` een `view('auth.login')` terug. Wissel je van frontend, dan hoef je alleen de `FortifyServiceProvider` aan te passen en blijft de authenticatielogica ongewijzigd.
</Info>

### 3. Configuratie van rate limiting

```php theme={null}
private function configureRateLimiting(): void
{
    RateLimiter::for('two-factor', function (Request $request) {
        return Limit::perMinute(5)->by($request->session()->get('login.id'));
    });

    RateLimiter::for('login', function (Request $request) {
        $throttleKey = Str::transliterate(
            Str::lower($request->input(Fortify::username())) . '|' . $request->ip()
        );

        return Limit::perMinute(5)->by($throttleKey);
    });
}
```

* De `login`-limiter: beperkt op de combinatie van e-mailadres en IP-adres (bescherming tegen brute force)
* De `two-factor`-limiter: beperkt op het inlogpoging-ID in de sessie

Je registreert bij `RateLimiter::for()` sleutels die overeenkomen met de `limiters`-sleutel in `config/fortify.php`.

## Belangrijkste functies en de geregistreerde routes

De belangrijkste routes die Fortify registreert, geordend per functie:

| Functie                           | Methode                   | Route                              |
| --------------------------------- | ------------------------- | ---------------------------------- |
| Inloggen                          | `GET`                     | `/login`                           |
| Inloggen                          | `POST`                    | `/login`                           |
| Uitloggen                         | `POST`                    | `/logout`                          |
| Registreren                       | `GET`                     | `/register`                        |
| Registreren                       | `POST`                    | `/register`                        |
| Wachtwoordherstel aanvragen       | `GET` / `POST`            | `/forgot-password`                 |
| Wachtwoordherstel                 | `GET` / `POST`            | `/reset-password`                  |
| E-mailverificatie                 | `GET`                     | `/email/verify`                    |
| Verificatielink opnieuw versturen | `POST`                    | `/email/verification-notification` |
| Wachtwoordbevestiging             | `GET` / `POST`            | `/user/confirm-password`           |
| 2FA inschakelen                   | `POST`                    | `/user/two-factor-authentication`  |
| 2FA-challenge                     | `GET` / `POST`            | `/two-factor-challenge`            |
| Inloggen met passkey              | `GET` / `POST`            | `/passkeys/login`                  |
| Passkeybeheer                     | `GET` / `POST` / `DELETE` | `/user/passkeys`                   |

Met `php artisan route:list --name=fortify` of gewoon `php artisan route:list` bekijk je de daadwerkelijk geregistreerde routes.

## Tweefactorauthenticatie (2FA)

In de starter kits is `Features::twoFactorAuthentication()` ingeschakeld. Zowel `confirm` als `confirmPassword` staat op `true`.

| Optie             | Betekenis                                                               |
| ----------------- | ----------------------------------------------------------------------- |
| `confirm`         | Vereist na het inschakelen een bevestiging met een authenticatiecode    |
| `confirmPassword` | Vereist wachtwoordbevestiging vóór het wijzigen van de 2FA-instellingen |

Vanuit het 2FA-instellingenscherm kan de gebruiker het volgende doen:

<Steps>
  <Step title="2FA inschakelen">
    Stuur een POST-request naar `/user/two-factor-authentication`. Bij succes wordt de status `two-factor-authentication-enabled` in de sessie gezet.
  </Step>

  <Step title="De QR-code bekijken">
    Stuur een GET-request naar `/user/two-factor-qr-code`; je krijgt de SVG van de QR-code terug om in te lezen in een authenticator-app.
  </Step>

  <Step title="Bevestigen met een authenticatiecode">
    Stuur de code via een POST-request naar `/user/confirmed-two-factor-authentication` om de configuratie te voltooien.
  </Step>

  <Step title="De herstelcodes opslaan">
    Stuur een GET-request naar `/user/two-factor-recovery-codes`, haal de herstelcodes op en bewaar ze op een veilige plek.
  </Step>
</Steps>

## Passkeys

Passkeys zijn recent toegevoegd als functie van Fortify. Het is wachtwoordloze authenticatie via WebAuthn, met ondersteuning voor Face ID, Touch ID, Windows Hello en hardwarebeveiligingssleutels.

### Inschakelen

Voeg toe aan de `features`-array in `config/fortify.php`.

```php theme={null}
'features' => [
    Features::registration(),
    Features::resetPasswords(),
    Features::emailVerification(),
    Features::twoFactorAuthentication([
        'confirm'         => true,
        'confirmPassword' => true,
    ]),
    Features::passkeys([
        'confirmPassword' => true,
    ]),
],
```

Voeg vervolgens het `PasskeyUser`-contract en de `PasskeyAuthenticatable`-trait toe aan het `User`-model.

```php theme={null}
use Illuminate\Foundation\Auth\User as Authenticatable;
use Laravel\Fortify\Contracts\PasskeyUser;
use Laravel\Fortify\PasskeyAuthenticatable;

class User extends Authenticatable implements PasskeyUser
{
    use PasskeyAuthenticatable;
}
```

De WebAuthn-instellingen beheer je onder de `passkeys`-sleutel in `config/fortify.php`.

```php theme={null}
'passkeys' => [
    'relying_party_id'  => parse_url(config('app.url'), PHP_URL_HOST),
    'allowed_origins'   => [config('app.url')],
    'user_handle_secret' => config('app.key'),
    'timeout'           => 60000,
],
```

<Info>
  De passkeys van Fortify wrappen intern het Composer-package `laravel/passkeys`. Je hoeft het configuratiebestand van `laravel/passkeys` niet te publiceren; de `passkeys`-sleutel in `config/fortify.php` krijgt voorrang.
</Info>

Voor de gedetailleerde implementatie van passkeys (de `@laravel/passkeys` JS-client, React/Vue/Svelte-helpers en meer), zie ook [Eerste verkenning van passkeys](/nl/blog/passkeys-introduction).

## Gerelateerde pagina's

<Card title="Custom authenticatieguards" icon="shield" href="/nl/advanced/custom-auth-guard">
  Uitleg over het bouwen van een custom authenticatieguard door de interfaces Guard en StatefulGuard te implementeren.
</Card>

<Card title="Officiële documentatie: Laravel Fortify" icon="book-open" href="https://laravel.com/docs/fortify">
  Zie de officiële documentatie voor installatie, alle functies en aanpassingsmogelijkheden.
</Card>


## Related topics

- [Migratiegids van laravel/ui naar Fortify](/nl/blog/ui-to-fortify.md)
- [Eerste verkenning van Laravel Passkeys (passkeys-server + @laravel/passkeys)](/nl/blog/passkeys-introduction.md)
- [Laravel Maestro — de orchestrator voor starter kit-ontwikkeling](/nl/blog/maestro-introduction.md)
- [Laravel PAO — outputoptimalisatie voor AI-agents](/nl/blog/pao-introduction.md)
- [Een SPA bouwen met Inertia.js](/nl/blog/inertia-introduction.md)
