> ## 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 und Starter-Kits

> Der interne Aufbau des Frontend-unabhängigen Authentifizierungs-Backends Laravel Fortify. Erklärt, warum Fortify in den aktuellen Starter-Kits eingesetzt wird, die Konfiguration des FortifyServiceProvider sowie die Aktivierung von 2FA und Passkeys.

## Was ist Fortify?

[Laravel Fortify](https://github.com/laravel/fortify) ist eine Frontend-unabhängige Authentifizierungs-Backend-Implementierung. Sie liefert sämtliche Routen und Controller, die für Login, Registrierung, Passwort-Reset, E-Mail-Bestätigung, 2FA und Passkeys nötig sind.

<Info>
  Fortify hat kein eigenes UI. Es funktioniert, indem ein Starter-Kit oder Ihr eigenes UI Requests an die Fortify-Routen sendet.
</Info>

Die Designphilosophie „Frontend-unabhängig" ist entscheidend: Ob Blade, Inertia (React/Vue/Svelte) oder API — Sie können dasselbe Auth-Backend über alle Frontend-Stacks hinweg wiederverwenden. Deshalb wird Fortify seit Jahren durchgehend verwendet.

## Historie: Von Jetstream zum aktuellen Starter-Kit

```mermaid theme={null}
timeline
    title Die Entwicklung von Fortify
    2020 Laravel 8 : Erscheint gemeinsam mit Jetstream
               : Fortify wird als Backend von Jetstream automatisch installiert
    2020 Laravel 8 : Breeze erscheint (ohne Fortify)
               : Als schlankes Auth-Scaffold eigenständig
    2025 Erneuerung der Starter-Kits : React-/Vue-Starter-Kits benötigen 2FA
                         : Fortify wird erneut aufgenommen → gesamte Auth basiert auf Fortify
    2026 Passkey-Support : Fortify erhält Passkey-Funktion
```

### Warum die aktuellen Starter-Kits weiterhin Fortify einsetzen

Die ursprünglichen React-/Vue-Starter-Kits wurden ohne Fortify umgesetzt. Als jedoch **die Zwei-Faktor-Authentifizierung (2FA) unterstützt werden musste, wurde Fortify direkt übernommen** — und mit ihm die gesamte Auth-Basis auf Fortify umgestellt.

Da Fortify als „Frontend-unabhängig" entworfen ist, harmoniert es hervorragend mit Inertia-basierten Starter-Kits und bleibt weiter im Einsatz.

<Info>
  Fortify ist derzeit das am längsten kontinuierlich verwendete offizielle Laravel-Auth-Paket. Seit seiner Einführung 2020 ist es in unterschiedlichen Formen (Jetstream → aktuelle Starter-Kits) aktiv.
</Info>

## Aufbau der aktuellen Starter-Kits

In den React-/Vue-Starter-Kits wird Fortify über folgende Dateien konfiguriert:

* `app/Providers/FortifyServiceProvider.php` — Registrierung von Views, Aktionen und Rate Limits
* `config/fortify.php` — Aktivierte Features und Auth-Konfiguration

### Wichtigste Einstellungen 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,
        ]),
    ],
];
```

Passkeys (`Features::passkeys()`) sind in den Starter-Kits standardmäßig nicht aktiviert. Zum Aktivieren fügen Sie den Eintrag im `features`-Array hinzu.

## Konfiguration im `FortifyServiceProvider`

Der `FortifyServiceProvider` der Starter-Kits übernimmt drei Aufgaben.

### 1. Aktionen konfigurieren

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

Klassen unter `app/Actions/Fortify/` kapseln die Logik für Benutzeranlage und Passwort-Reset. Validierung und Hashing bündeln sich hier.

### 2. Views konfigurieren

```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'));
}
```

Jede View-Methode erhält eine Closure, die eine Inertia-Komponente zurückgibt. Wichtig: Über `Features::enabled()` werden Feature-Flags geprüft und an die View übergeben.

<Info>
  In Blade-Anwendungen geben Sie statt `Inertia::render(...)` einfach `view('auth.login')` zurück. Wechseln Sie das Frontend, müssen Sie nur den `FortifyServiceProvider` anpassen — die Auth-Logik bleibt unverändert.
</Info>

### 3. Rate Limits konfigurieren

```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);
    });
}
```

* Limiter `login`: Begrenzung nach Kombination aus E-Mail-Adresse und IP-Adresse (Brute-Force-Schutz).
* Limiter `two-factor`: Begrenzung anhand der Login-Versuchs-ID in der Session.

Registrieren Sie in `RateLimiter::for()` denselben Key wie in `config/fortify.php` unter `limiters`.

## Wichtige Funktionen und registrierte Routen

Überblick über die von Fortify registrierten Routen nach Feature.

| Feature                              | Methode                   | Route                              |
| ------------------------------------ | ------------------------- | ---------------------------------- |
| Login                                | `GET`                     | `/login`                           |
| Login                                | `POST`                    | `/login`                           |
| Logout                               | `POST`                    | `/logout`                          |
| Registrierung                        | `GET`                     | `/register`                        |
| Registrierung                        | `POST`                    | `/register`                        |
| Passwort-Reset-Anforderung           | `GET` / `POST`            | `/forgot-password`                 |
| Passwort-Reset                       | `GET` / `POST`            | `/reset-password`                  |
| E-Mail-Bestätigung                   | `GET`                     | `/email/verify`                    |
| Erneut senden des Bestätigungs-Links | `POST`                    | `/email/verification-notification` |
| Passwortbestätigung                  | `GET` / `POST`            | `/user/confirm-password`           |
| 2FA aktivieren                       | `POST`                    | `/user/two-factor-authentication`  |
| 2FA-Challenge                        | `GET` / `POST`            | `/two-factor-challenge`            |
| Passkey-Login                        | `GET` / `POST`            | `/passkeys/login`                  |
| Passkey-Verwaltung                   | `GET` / `POST` / `DELETE` | `/user/passkeys`                   |

Mit `php artisan route:list --name=fortify` oder einfach `php artisan route:list` sehen Sie die tatsächlich registrierten Routen.

## Zwei-Faktor-Authentifizierung (2FA)

In den Starter-Kits ist `Features::twoFactorAuthentication()` aktiviert. `confirm` und `confirmPassword` sind beide auf `true` gesetzt.

| Option            | Bedeutung                                                   |
| ----------------- | ----------------------------------------------------------- |
| `confirm`         | Verlangt nach dem Aktivieren eine Bestätigung per Auth-Code |
| `confirmPassword` | Verlangt vor 2FA-Änderungen eine Passwortbestätigung        |

Aus dem 2FA-Konfigurationsbildschirm können Nutzer folgende Aktionen ausführen.

<Steps>
  <Step title="2FA aktivieren">
    Ein POST-Request an `/user/two-factor-authentication`. Bei Erfolg wird in der Session der Status `two-factor-authentication-enabled` gesetzt.
  </Step>

  <Step title="QR-Code anzeigen">
    Ein GET-Request an `/user/two-factor-qr-code` liefert das SVG des QR-Codes zum Scannen in der Authenticator-App.
  </Step>

  <Step title="Mit Auth-Code bestätigen">
    Ein POST-Request mit Code an `/user/confirmed-two-factor-authentication` schließt die Einrichtung ab.
  </Step>

  <Step title="Recovery-Codes speichern">
    Ein GET-Request an `/user/two-factor-recovery-codes` liefert Recovery-Codes, die an einem sicheren Ort aufbewahrt werden sollten.
  </Step>
</Steps>

## Passkeys

Passkeys wurden erst kürzlich als Fortify-Feature ergänzt. Sie bieten passwortlose Authentifizierung per WebAuthn und unterstützen Face ID, Touch ID, Windows Hello und Hardware-Security-Keys.

### Aktivieren

Ergänzen Sie das `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,
    ]),
],
```

Fügen Sie zusätzlich das Contract `PasskeyUser` und den Trait `PasskeyAuthenticatable` am `User`-Modell hinzu.

```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;
}
```

Die WebAuthn-Einstellungen verwalten Sie unter dem Schlüssel `passkeys` 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>
  Fortifys Passkey-Unterstützung wrappt intern das Composer-Paket `laravel/passkeys`. Sie müssen dessen Konfiguration nicht veröffentlichen; die Werte unter `passkeys` in `config/fortify.php` haben Vorrang.
</Info>

Details zur Passkey-Implementierung (JS-Client `@laravel/passkeys`, React/Vue/Svelte-Helper usw.) finden Sie in der [Passkey-Erstuntersuchung](/de/blog/passkeys-introduction).

## Verwandte Seiten

<Card title="Eigene Auth-Guards" icon="shield" href="/de/advanced/custom-auth-guard">
  Erläutert, wie Sie durch Implementierung der Interfaces Guard und StatefulGuard eigene Authentifizierungs-Guards bauen.
</Card>

<Card title="Offizielle Dokumentation: Laravel Fortify" icon="book-open" href="https://laravel.com/docs/fortify">
  Für Installation, alle Funktionen und Anpassungen konsultieren Sie die offizielle Dokumentation.
</Card>


## Related topics

- [Ein Laravel-Starter-Kit erstellen](/de/advanced/starter-kit-creation.md)
- [Feedable](/de/packages/feedable/index.md)
- [Starter Kits](/de/starter-kits.md)
- [Migrations-Guide von laravel/ui zu Fortify](/de/blog/ui-to-fortify.md)
- [Laravel Console Starter](/de/packages/laravel-console-starter/index.md)
