Laravel Passport für PHP: Vollständige Anleitung mit Codebeispielen

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Laravel Passport für PHP: Vollständige Anleitung zum OAuth2-Server

1. Was ist Laravel Passport und wozu braucht man es?

Laravel Passport ist eine vollständige Implementierung eines OAuth2-Servers für das Laravel-Framework (PHP). Es bietet einen fertigen Werkzeugsatz zur Erstellung einer API-Authentifizierung und ermöglicht Entwicklern, ihre RESTful-APIs schnell mit standardmäßigen Access- und Refresh-Tokens zu schützen. Die Bibliothek basiert auf dem leistungsstarken Paket League OAuth2 Server, das an das Laravel-Ökosystem angepasst wurde – inklusive Migrationen, Fassaden, Artisan-Befehlen und Eloquent-Modellen.

Das Hauptziel von Passport ist es, den Entwickler von der mühsamen manuellen Implementierung der Token-Generierung, -Prüfung und -Speicherung zu befreien. Stattdessen erhalten Sie vorgefertigte Routen zur Token-Ausgabe (über Grant Types), Middleware zum Schutz Ihrer Routen sowie praktische Methoden zur Verwaltung von Clients (Anwendungen) und Tokens. Passport eignet sich ideal für Single Page Applications (SPAs), mobile Apps und serverseitige Clients, die einen sicheren Zugriff auf Ihre API benötigen.

Warum Passport statt einer Eigenentwicklung? Erstens die Sicherheit: Die Bibliothek setzt alle Anforderungen der OAuth2-Spezifikation um, inklusive CSRF-Schutz, korrekter Scope-Verarbeitung und PKCE (Proof Key for Code Exchange). Zweitens die Entwicklungsgeschwindigkeit: Sie erhalten fertige Migrationen, Modelle und Controller. Drittens die Flexibilität: Passport unterstützt alle wichtigen Grant Types (Authorization Code, Client Credentials, Password Grant, Personal Access Tokens) und lässt sich leicht an spezifische Anforderungen anpassen.

2. Installation

Die Installation von Laravel Passport erfolgt über Composer, den Standard-Paketmanager für PHP. Führen Sie folgenden Befehl im Stammverzeichnis Ihres Laravel-Projekts aus:

composer require laravel/passport

Nach der Installation des Pakets müssen Sie die Migrationen ausführen und die Konfiguration veröffentlichen. Passport verwendet ein eigenes Migrationssystem, das Tabellen für Clients, Tokens, Autorisierungscodes und persönliche Tokens anlegt:

php artisan migrate

Führen Sie anschließend den Befehl passport:install aus. Dieser erstellt Verschlüsselungsschlüssel sowie Clients für persönliche Tokens und den Password Grant:

php artisan passport:install

Nach der Ausführung sehen Sie in der Konsole zwei client_id und client_secret. Der erste ist für persönliche Tokens (Personal Access Client), der zweite für den Password Grant (Password Grant Client). Speichern Sie diese in Ihrer .env-Datei:

PASSPORT_PERSONAL_ACCESS_CLIENT_ID=1
PASSPORT_PERSONAL_ACCESS_CLIENT_SECRET=ihr-geheimnis-hier
PASSPORT_PASSWORD_GRANT_CLIENT_ID=2
PASSPORT_PASSWORD_GRANT_CLIENT_SECRET=ihr-geheimnis-hier

Fügen Sie nun das Trait Laravel\Passport\HasApiTokens in Ihr User-Modell ein (app/Models/User.php):

<?php

namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens;

class User extends Authenticatable
{
    use HasApiTokens, Notifiable;

    protected $fillable = [
        'name', 'email', 'password',
    ];

    protected $hidden = [
        'password', 'remember_token',
    ];
}

Ändern Sie in der Datei config/auth.php den Authentifizierungstreiber auf passport:

'guards' => [
    'api' => [
        'driver' => 'passport',
        'provider' => 'users',
    ],
],

Fügen Sie schließlich in der Datei app/Providers/AuthServiceProvider.php den Aufruf Passport::routes() in der boot()-Methode hinzu:

<?php

namespace App\Providers;

use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Laravel\Passport\Passport;

class AuthServiceProvider extends ServiceProvider
{
    public function boot()
    {
        $this->registerPolicies();
        Passport::routes();
    }
}

Empfehlungen