Einrichten eines OAuth2-Servers mithilfe von Passport in Laravel

In diesem Artikel erfahren Sie, wie Sie mit der Laravel Passport-Bibliothek einen vollwertigen OAuth2-Server in Laravel einrichten können. Wir werden die erforderlichen Serverkonfigurationen zusammen mit einem realen Beispiel durchgehen, um zu zeigen, wie Sie OAuth2-APIs verwenden können.

Ich gehe davon aus, dass Sie mit den grundlegenden OAuth2-Konzepten und dem Ablauf vertraut sind, während wir sie im Kontext von Laravel diskutieren. Die Laravel Passport-Bibliothek macht es sehr einfach, einen OAuth2-Server schnell in Ihrer Anwendung einzurichten. Daher können andere Anwendungen von Drittanbietern APIs verbrauchen, die von Ihrer Anwendung bereitgestellt werden.

In der ersten Hälfte des Artikels werden wir die erforderlichen Bibliotheken installieren und konfigurieren. In der zweiten Hälfte wird beschrieben, wie Sie Demo-Ressourcen in Ihrer Anwendung einrichten und von Drittanbieteranwendungen verwenden.

Serverkonfigurationen

In diesem Abschnitt werden die Abhängigkeiten installiert, die erforderlich sind, damit die Passport-Bibliothek mit Laravel zusammenarbeitet. Nach der Installation müssen wir einige Konfigurationen durchführen, damit Laravel die Passport-Bibliothek erkennen kann.

Fahren Sie fort und installieren Sie die Passport-Bibliothek mit Composer.

$ composer benötigen einen Laravel / Reisepass

Das ist so ziemlich alles, was die Installation der Passport-Bibliothek angeht. Jetzt stellen wir sicher, dass Laravel davon weiß.

Wenn Sie mit Laravel arbeiten, kennen Sie wahrscheinlich das Konzept eines Service Providers, mit dem Sie Services in Ihrer Anwendung konfigurieren können. Wenn Sie also einen neuen Dienst in Ihrer Laravel-Anwendung aktivieren möchten, müssen Sie lediglich einen zugehörigen Diensteanbieter-Eintrag in der config / app.php.

Wenn Sie Laravel-Dienstanbieter noch nicht kennen, kann ich Ihnen dringend empfehlen, sich selbst einen Gefallen zu tun und diesen einleitenden Artikel zu lesen, der die Grundlagen der Diensteanbieter in Laravel erläutert.

In unserem Fall müssen wir nur das hinzufügen PassportServiceProvider der Liste der Diensteanbieter in config / app.php wie im folgenden Ausschnitt gezeigt.

… 'Provider' => [/ * * Laravel Framework Service Provider… * / Illuminate \ Auth \ AuthServiceProvider :: Klasse, Beleuchtung \ Broadcasting \ BroadcastServiceProvider :: Klasse, Illuminate \ Bus \ BusServiceProvider :: Klasse, Illuminate \ Cache \ CacheServiceProvider: : Klasse, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: Klasse, Illuminate \ Cookie \ CookieServiceProvider :: Klasse, Illuminate \ Database \ DatabaseServiceProvider :: Klasse, Illuminate \ Encryption \ EncryptionServiceProvider :: Klasse, Illuminate \ Filesystem \ FilesystemServiceProvider :: Klasse, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: Klasse, Illuminate \ Hashing \ HashServiceProvider :: Klasse, Illuminate \ Mail \ MailServiceProvider :: Klasse, Illuminate \ Notifications \ NotificationServiceProvider :: Klasse, Illuminate \ Pagination \ PaginationServiceProvider :: Klasse, Illuminate \ Pipeline \ PipelineServiceProvider :: Klasse, Illuminate \ Queue \ QueueServiceProvider :: Klasse, Illuminate \ Redis \ RedisServiceProvider :: Klasse, Illuminate \ Auth \ Passwords \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: class, Illuminate \ Übersetzung \ TranslationServiceProvider :: class, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Paketdienstanbieter… * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Anwendungsdienstanbieter… * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Laravel \ Passport \ PassportServiceProvider :: class,],… 

Als nächstes müssen wir das ausführen Wandern handwerklicher Befehl, der die erforderlichen Tabellen in einer Datenbank für die Passport-Bibliothek erstellt.

$ php Handwerker migrieren

Um genau zu sein, erstellt es nach den Tabellen in der Datenbank.

oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens

Als Nächstes müssen Sie ein Paar öffentlicher und privater Schlüssel generieren, die von der Passport-Bibliothek für die Verschlüsselung verwendet werden. Wie erwartet bietet die Passport-Bibliothek einen handwerklichen Befehl, um ihn leicht zu erstellen.

$ php handwerklicher Reisepass: installieren

Das hätte Schlüssel an erstellt storage / oauth-public.key und storage / oauth-private.key. Es erstellt auch einige Demo-Client-Anmeldeinformationen, auf die wir später zurückkommen.

Voran gehen, lass uns oauthify die vorhandene Benutzermodellklasse, die Laravel für die Authentifizierung verwendet. Dazu müssen wir das hinzufügen HasApiTokens Merkmal der Nutzer Modellklasse. Lassen Sie uns das tun, wie im folgenden Ausschnitt gezeigt.

Das HasApiTokens Trait enthält Hilfsmethoden, mit denen Token in der Anforderung überprüft und der Umfang der Ressourcen geprüft wird, die im Kontext des aktuell authentifizierten Benutzers angefordert werden.

Außerdem müssen wir die von der Passport-Bibliothek bereitgestellten Routen in unserer Laravel-Anwendung registrieren. Diese Routen werden für Standard-OAuth2-Vorgänge wie Autorisierung, Anfordern von Zugriffstoken und dergleichen verwendet.

In der Boot-Methode des app / Providers / AuthServiceProvider.php Datei, lassen Sie uns die Routen der Passport-Bibliothek registrieren.

… / ** * Registrieren Sie alle Authentifizierungs- / Autorisierungsdienste. * * @return void * / public function boot () $ this-> registerPolicies (); Pass :: routen (); … 

Nicht zuletzt müssen wir das ändern api Treiber vom Token zum Pass im config / auth.php Datei, da wir die Passport-Bibliothek für die API-Authentifizierung verwenden werden.

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

Bisher haben wir alles getan, was die Konfiguration des OAuth2-Servers betrifft.

Richten Sie die Demo-Ressourcen ein

Im vorherigen Abschnitt haben wir alle harte Arbeit beim Einrichten des OAuth2-Authentifizierungsservers in unserer Anwendung ausgeführt. In diesem Abschnitt richten wir eine Demo-Ressource ein, die über den API-Aufruf angefordert werden kann.

Wir werden versuchen, die Dinge einfach zu halten. Unsere Demo-Ressource gibt die Benutzerinformationen zurück, vorausgesetzt, es gibt eine gültige uid Parameter vorhanden in der ERHALTEN anfordern.

Lassen Sie uns eine Controller-Datei erstellen app / Http / Controller / UserController.php mit folgenden Inhalten.

get ("uid", 0); $ user = User :: find ($ user_id); $ Benutzer zurückgeben; 

Wie üblich müssen Sie auch eine zugehörige Route hinzufügen, die Sie im hinzufügen möchten routen / web.php Datei. Worüber wir reden, ist die API-Route, und daher bedarf es einer besonderen Behandlung.

Die API-Routen sind in definiert routen / api.php Datei. Fügen wir also unsere benutzerdefinierte API-Route hinzu, wie im folgenden Snippet gezeigt.

get ('/ user', Funktion (Request $ request) return $ request-> user ();); // Benutzerdefinierte API-Route Route :: Middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');

Obwohl wir es als definiert haben / user / erhalten, Die effektive API-Route lautet / api / user / get, Und das sollten Sie verwenden, wenn Sie über diese Route eine Ressource anfordern. Das api Das Präfix wird automatisch von Laravel behandelt, und Sie müssen sich nicht darum kümmern!

Im nächsten und letzten Abschnitt erfahren Sie, wie Sie Client-Anmeldeinformationen erstellen und die OAuth2-API verwenden können.

So verwenden Sie OAuth2-APIs

Nun, da wir den OAuth2-Server in unserer Anwendung eingerichtet haben, kann jeder Dritte mit OAuth eine Verbindung zu unserem Server herstellen und die in unserer Anwendung verfügbaren APIs verwenden.

Zunächst müssen sich Anwendungen von Drittanbietern bei unserer Anwendung registrieren, um APIs nutzen zu können. Mit anderen Worten, sie werden als Clientanwendungen betrachtet und erhalten bei der Registrierung eine Client-ID und ein Client-Secret.

Die Passport-Bibliothek bietet einen handwerklichen Befehl zum Erstellen von Kundenkonten ohne viel Aufwand. Erstellen Sie jetzt einen Demo-Client-Account.

$ php handwerklicher Pass: Client Welcher Benutzer-ID sollte der Client zugewiesen werden ?:> 1 Wie sollen wir den Client nennen ?:> Demo OAuth2 Client Account Wohin sollten wir die Anforderung nach der Autorisierung umleiten? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Neuer Client erfolgreich erstellt. Client-ID: 1 Client-Geheimnis: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01

Wenn Sie den Handwerker führen Reisepass: Kunde Wenn Sie den Befehl ausführen, werden einige Fragen gestellt, bevor Sie das Kundenkonto erstellen. Davon gibt es eine wichtige, die Sie fragt Rückruf-URL.

Das Rückruf-URL ist derjenige, bei dem Benutzer nach der Autorisierung zum Ende des Drittanbieters weitergeleitet werden. Und dort wird der Autorisierungscode gesendet, der im Austausch für das Zugriffstoken verwendet werden soll. Wir werden diese Datei in Kürze erstellen.

Jetzt können wir die OAuth2-APIs in der Laravel-Anwendung testen.

Zu Demonstrationszwecken werde ich das erstellen oauth2_client Verzeichnis unter dem Dokumentstamm an erster Stelle. Idealerweise befinden sich diese Dateien bei Drittanbietern, die APIs in unserer Laravel-Anwendung verwenden möchten.

Lass uns die erstellen oauth2_client / auth_redirection.php Datei mit folgendem Inhalt.

 '1', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', 'response_type' => 'code', 'scope' => ",))); header ('Location: http: / /your-laravel-site-url/oauth/authorize?'.$query);

Stellen Sie sicher, dass Sie das ändern Kunden ID und redirect_uri Parameter, die Ihre eigenen Einstellungen widerspiegeln, die Sie beim Erstellen des Demo-Client-Kontos verwendet haben.

Als nächstes erstellen wir die oauth2_client / callback.php Datei mit folgendem Inhalt.

 'Authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3gT3PT1PssoTX0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/cachl2/clach/ Code ']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; if (is_array ($ params) && count ($ params)) foreach ($ params als $ key => $ value) $ params_string. = $ key. '='. $ value. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, Anzahl ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); $ ch); $ response = json_decode ($ result); // prüfe, ob die Antwort access_token enthält if (isset ($ response-> access_token) && $ response-> access_token) // Sie möchten das access_token in der Sitzung speichern allerdings… $ access_token = $ response-> access_token; // Verwenden Sie das obige Token, um weitere API-Aufrufe in dieser Sitzung durchzuführen, oder bis das Zugriffstoken abgelaufen ist. $ ch = curl_init (); $ url = 'http: // Ihre-Laravel-Site -url / api / user / get '; $ header = array (' Authorization: Bearer '. $ access_token); $ query = http_build_query (array (' uid '=>' 1 ')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ query); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ result = curl_e xec ($ ch); curl_close ($ ch); $ response = json_decode ($ result); var_dump ($ result);  else // aus irgendeinem Grund war das access_token nicht verfügbar // das Debugging geht hier hin

Vergewissern Sie sich erneut, dass Sie die URLs und die Anmeldeinformationen des Clients gemäß Ihren Einstellungen in der obigen Datei anpassen.

Wie es zusammen funktioniert

In diesem Abschnitt testen wir es vollständig aus der Perspektive eines Endbenutzers. Als Endbenutzer stehen Ihnen zwei Anwendungen zur Verfügung:

  1. Die erste ist die Laravel-Anwendung, mit der Sie bereits ein Konto haben. Sie enthält Ihre Informationen, die Sie mit anderen Anwendungen von Drittanbietern teilen können.
  2. Die zweite ist die Demo-Clientanwendung von Drittanbietern, auth_redirection.php und callback.php, Dies möchte Ihre Informationen mithilfe der OAuth-API aus der Laravel-Anwendung abrufen.

Der Fluss beginnt bei der Drittanbieter-Clientanwendung. Öffnen Sie die URL http: //localhost/oauth2_client/auth_redirection.php in Ihrem Browser. Diese sollte Sie zur Laravel-Anwendung umleiten. Wenn Sie noch nicht bei der Laravel-Anwendung angemeldet sind, werden Sie von der Anwendung zunächst dazu aufgefordert.

Sobald der Benutzer angemeldet ist, zeigt die Anwendung die Autorisierungsseite an.

Wenn der Benutzer diese Anforderung autorisiert, wird der Benutzer zusammen mit der Client-Anwendung unter http: //localhost/oauth2_client/callback.php an die Drittanbieter-Clientanwendung zurückgeleitet Code als die ERHALTEN Parameter, der den Berechtigungscode enthält.

Sobald die Drittanbieteranwendung den Autorisierungscode erhalten hat, könnte sie diesen Code mit der Laravel-Anwendung austauschen, um das Zugriffstoken zu erhalten. Und genau das hat es im folgenden Ausschnitt des getan oauth2_client / callback.php Datei.

$ ch = curl_init (); $ url = 'http: // Ihre-Laravel-Site-URL / oauth / token'; $ parach = array ('grant_typl' = '' authorization_code '),' client_id '=>' 1 ',' client_secret '=>' zMm0tQ9Cp7lkjk3QTgPy1pssoT1X0u7sg0YWUW01 ',' redirect_uri '=>' http '. , 'code' => $ _REQUEST ['code']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; if (is_array ($ params) && count ($ params)) foreach ($ params als $ key => $ value) $ params_string. = $ key. '='. $ value. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, Anzahl ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); $ ch); $ response = json_decode ($ result);

Als Nächstes prüft die Drittanbieteranwendung die Antwort der CURL-Anforderung, um zu sehen, ob sie an erster Stelle ein gültiges Zugriffstoken enthält.

Sobald die Drittanbieteranwendung das Zugriffstoken erhält, könnte sie dieses Token verwenden, um weitere API-Aufrufe auszuführen, um bei Bedarf Ressourcen von der Laravel-Anwendung anzufordern. Natürlich muss das Zugriffstoken in jeder Anforderung übergeben werden, die Ressourcen von der Laravel-Anwendung anfordert.

Wir haben versucht, den Anwendungsfall nachzuahmen, indem die Anwendung eines Drittanbieters auf die Benutzerinformationen aus der Laravel-Anwendung zugreifen möchte. Und wir haben bereits einen API-Endpunkt, http: // Ihre-Laravel-Site-URL / api / user / get, in der Laravel-Anwendung entwickelt, die dies ermöglicht.

// Prüfen Sie, ob die Antwort access_token enthält if (isset ($ response-> access_token) && $ response-> access_token) // Sie möchten das access_token in der Sitzung speichern, obwohl… $ access_token = $ response-> access_token; // Verwenden Sie das obige Token, um weitere API-Aufrufe in dieser Sitzung durchzuführen oder bis das Zugriffstoken abgelaufen ist. $ ch = curl_init (); $ url = 'http: // Ihre-Laravel-Site-URL / api / user / get'; $ header = array ('Authorization: Bearer'. $ access_token); $ query = http_build_query (array ('uid' => '1')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ query); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ result = curl_exec ($ ch); curl_close ($ ch); $ response = json_decode ($ result); var_dump ($ result); 

Das ist also der vollständige Ablauf, wie Sie die OAuth2-APIs in Laravel verwenden sollen.

Damit sind wir am Ende dieses Artikels angelangt.

Fazit

Heute haben wir die Passport-Bibliothek in Laravel erkundet, wodurch wir einen OAuth2-Server sehr einfach in einer Anwendung einrichten können. 

Für diejenigen unter Ihnen, die entweder gerade mit Laravel beginnen oder Ihr Wissen, Ihre Site oder Anwendung mit Erweiterungen erweitern möchten, haben wir eine Vielzahl von Möglichkeiten, die Sie in Envato Market lernen können.

Zögern Sie nicht, teilen Sie Ihre Gedanken und Fragen mit dem untenstehenden Feed!