Zum Hauptinhalt springen

Was ist Fortify?

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.
Fortify hat kein eigenes UI. Es funktioniert, indem ein Starter-Kit oder Ihr eigenes UI Requests an die Fortify-Routen sendet.
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

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.
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.

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

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

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

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.
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.

3. Rate Limits konfigurieren

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.
FeatureMethodeRoute
LoginGET/login
LoginPOST/login
LogoutPOST/logout
RegistrierungGET/register
RegistrierungPOST/register
Passwort-Reset-AnforderungGET / POST/forgot-password
Passwort-ResetGET / POST/reset-password
E-Mail-BestätigungGET/email/verify
Erneut senden des Bestätigungs-LinksPOST/email/verification-notification
PasswortbestätigungGET / POST/user/confirm-password
2FA aktivierenPOST/user/two-factor-authentication
2FA-ChallengeGET / POST/two-factor-challenge
Passkey-LoginGET / POST/passkeys/login
Passkey-VerwaltungGET / 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.
OptionBedeutung
confirmVerlangt nach dem Aktivieren eine Bestätigung per Auth-Code
confirmPasswordVerlangt vor 2FA-Änderungen eine Passwortbestätigung
Aus dem 2FA-Konfigurationsbildschirm können Nutzer folgende Aktionen ausführen.
1

2FA aktivieren

Ein POST-Request an /user/two-factor-authentication. Bei Erfolg wird in der Session der Status two-factor-authentication-enabled gesetzt.
2

QR-Code anzeigen

Ein GET-Request an /user/two-factor-qr-code liefert das SVG des QR-Codes zum Scannen in der Authenticator-App.
3

Mit Auth-Code bestätigen

Ein POST-Request mit Code an /user/confirmed-two-factor-authentication schließt die Einrichtung ab.
4

Recovery-Codes speichern

Ein GET-Request an /user/two-factor-recovery-codes liefert Recovery-Codes, die an einem sicheren Ort aufbewahrt werden sollten.

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.
'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.
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.
'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,
],
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.
Details zur Passkey-Implementierung (JS-Client @laravel/passkeys, React/Vue/Svelte-Helper usw.) finden Sie in der Passkey-Erstuntersuchung.

Verwandte Seiten

Eigene Auth-Guards

Erläutert, wie Sie durch Implementierung der Interfaces Guard und StatefulGuard eigene Authentifizierungs-Guards bauen.

Offizielle Dokumentation: Laravel Fortify

Für Installation, alle Funktionen und Anpassungen konsultieren Sie die offizielle Dokumentation.
Zuletzt geändert am 13. Juli 2026