JWT in Laravel einrichten – Kurz mal erklärt

Ein sehr großes Topic vor beginn einer neuen Applikation ist die Authentifizierung. Bei der Hypoport AG in Berlin wurde bei einem Projekt ein ganzer Monat mit mehreren Entwicklerteams das Thema Login geplant. In anderen Projekten, die sicher laufen sollen, verhält sich das ähnlich.

Deswegen sollte das Thema von Anfang an immer gut durchdacht sein. Erspart einem eine Menge Zeit und Ärger.

Laravel bietet eine Reihe von Authentifizierung Bibliotheken an. Die Umfänglichste ist Laravel Passport. Eine smart, elegante ist JWT. Genau diese möchte ich heute euch kurz mal vorstellen.

JWT steht für JSON Web Token

Bei der Komminkation zwischen dem Browser und dem Server ist es notwendig den Nutzer eindeutig zu identifizieren. Es geht Sessionbasiert oder wie beim JWT token basiert. Der Ablauf sieht wie folgt aus:

  • Nutzer besucht unserer Website
  • Nutzer logt sich mit seiner Emailadresse und Passwort über das entsprechende Login Formular ein
  • Server überprüft seine Anfragen und bei erfolgreichem Abgleichen gibt der Server dem Browser einen Token zurück.
  • der zurückgelieferte Token wird entweder im LocalStorage oder in einem Cookie gespeichert
  • beim nächsten Request zu Server wird der Token im Header als Bearer mitgeliefert (hier wird gerne der Header Accept vergessen. Der da sein sollte application/json)
  • der Server kann anhand des Token den Nutzer identifizieren und weiß zumindest wem er nun die Antwort schickt

In unserem Beispiel möchten wir mal eine ganz einfache Nutzer Verwaltung erstellen. Der Einfachheitshalber regeln wir das alles ohne Controller sondern direkt im Router (api.php).

1. Wir installieren Laravel

2. Wir installieren JWT Auth mit

composer require tymon/jwt-auth

Wenn Du jwt-auth nicht installieren kannst, weil diese oder eine ähnliche Ausgabe in deiner Console erscheint:

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - Root composer.json requires tymon/jwt-auth ^0.5.12 -> satisfiable by tymon/jwt-auth[0.5.12].
    - tymon/jwt-auth 0.5.12 requires illuminate/support ~5.0 -> found illuminate/support[v5.0.0, ..., 5.8.x-dev] but it conflicts with another require.


Installation failed, reverting ./composer.json and ./composer.lock to their original content.

Kannst Du es mal mit diesem composer Befehl versuchen. Denn wahrscheinlich gibt es bei Dir ein kleines Versionsproblem.

composer require tymon/jwt-auth --ignore-platform-reqs

3. Wir setzen den JWT Provider mit:

php artisan vendor:publish --provider="Tymon\JWTAuth\Providers\LaravelServiceProvider"

4. Wir generieren unser JWT Secret Key mit:

php artisan jwt:secret

5. Wir implementieren in unserem User Model die Klasse Tymon\JWTAuth\Contracts\JWTSubject

– use Tymon\JWTAuth\Contracts\JWTSubject

– wir implementieren das Model User mit dem JWTSubject Interface

class User extends Authenticatable implements JWTSubject

– wir fügen die zwei JWTSubject Methoden hinzu:

getJWTIdentifier(): Gibt den JWT Token zurück.

getJWTCustomClaims(): Gibt ein Array, mit benutzerdefinierten Benutzeranforderungen zurück

**
     * Get the identifier that will stored
     *
     * @return mixed
     */
    public function getJWTIdentifier() {
        return $this->getKey();
    }

    /**
     * Return a key value array with containing any custom claims
     *
     * @return array
     */
    public function getJWTCustomClaims() {
        return [];
    } 

6. Wir konfigurieren unser Auth Guard und sagen dem System , dass wir die api Anfragen mit JWT authentifizieren möchten

   'guards' => [
        'web' => [
            'driver' => 'session',
            'provider' => 'users',
        ],

        'api' => [
            'driver' => 'jwt',
            'provider' => 'users',
            'hash' => false,
        ],

Jetzt schreiben wir in unser Routes einige testrouten:

// create a user
Route::post('/create-user', function (Request $request) {
    App\Models\User::create([
        'name' => 'Martin',
        'email' => 'martin@peoplehelper.org',
        'password' => Hash::make('password')
    ]);
    return $request->user();
});
//Route::get('/user-create', [App\Http\Controllers\User::class, 'test'])->name('test');

// login a user
Route::post('/login', function (Request $request) {
    $credentials = $request->only(['email','password']);
    $token = auth()->attempt($credentials);
    return $token;
});

// grab auth user
Route::middleware('auth')->get('/user-profile', function (Request $request) {
    return auth()->user();
});

Leave a Comment

Your email address will not be published. Required fields are marked *

*

*

Empfholende Artikel


Laravel Test möglicher Fehler – Unknown formatter “name”

April 17, 2021

Falls Du gerade Dein Test geschrieben hast und du deinen Test mit php artisan test startest kann es sein, dass Du folgende Fehlermeldung erhalten kannst: Was ist passiert? Wahrscheinlich hast Du in deiner seUp() Methode oder in deiner Testfunktion ein factory eingebaut. Zum Beispiel Da Laravel einige Optimierungen vorgenommen hat, kannst Du nicht die Standard […]

Eine einzelne Migration in Laravel ausführen

March 25, 2021

Aus unterschiedlichen Gründen kann es sein, dass man in einem Laravel Projekt eine spezielle Migration ausführen möchte. Zum Beispiel die zuletzt erstellte Migration. Ein anscheinend häufiger Grund für dieses Vorgehen könnte sein, dass in einer vorherigen Migrationsdatei ein Fehler auftreten würde. Und da Laravel die Migrationsdateien von der ältestesten zur jüngsten Migration abarbeitet, würde man […]

Laravel Faker – Kurz mal erklärt

March 6, 2021

Alle nutzen anscheint Faker. Es gab mal einen ehemaligen US Präsidenten der meinte die Washington Post verbreitet Fake(r) News. Er selbest wiederum hatte sich eine Faker API in sein damals noch nicht gesperrten Twitter Account reinlegen lassen. Fakes sind in der Geschichte der Menschheit immer präsent gewesen und nicht erst seit 2016. Aber zurück zum […]

Laravel – Service, Repository Pattern

February 6, 2021

Ein wichtiger Baustein der Softwareentwicklung ist die Softwarearchitektur. Ab einer bestimmten Größe steht und fällt, meines Erachtens, ein Projekt mit der Softwarearchitektur. Damit ist nicht gemeint, das prozedural geschriebener Code perse schlecht ist. Im Gegenteil. In der Vergangenheit habe ich mit prozedural geschriebenen Code gute Software gebaut die teilweise bis heute läuft. Ich erinnere mich […]

Laravel Model kurz mal erklärt

January 26, 2021

Heute mal leichte Kost. Laravel Model. Was ist das und was stellt man damit an, wie erstellt man ein Model und was kann es so alles. Genug der langen Worte, fangen wir an! Was ist ein Model? Dafür blicken wir auf ein DesignPattern der Programmierung und zwar dem MVC Muster. MVC steht für Model, View […]

Laravel config Datei anlegen

December 1, 2020

Ich musste mal bei einer bestehenden Laravel Installation eine Paypal Integration bei einem Kunden vornehmen. Nebenbei bemerkt möchte ich das mal loswerden. Paypal hat eine schreckliche Dokumentation. Sie ist überhaupt nicht intuitiv. Aber das ist überhaupt ein anderes Thema. Ich installierte im Projekt über den Composer die Paypal SDK: Zusätzlich legte ich mir einen neuen […]