Een OAuth2-server instellen met Passport in Laravel

In dit artikel gaan we onderzoeken hoe u een volwaardige OAuth2-server in Laravel kunt opzetten met behulp van de Laravel Passport-bibliotheek. We zullen de noodzakelijke serverconfiguraties doorlopen, samen met een voorbeeld uit de praktijk om te laten zien hoe u OAuth2 API's kunt gebruiken.

Ik ga ervan uit dat je bekend bent met de basis OAuth2-concepten en -stromen zoals we die in de context van Laravel zullen bespreken. In feite maakt de Laravel Passport-bibliotheek het vrij eenvoudig om snel een OAuth2-server in te stellen in uw toepassing. Andere applicaties van derden kunnen dus API's gebruiken die door uw toepassing worden verstrekt.

In de eerste helft van het artikel zullen we de nodige bibliotheken installeren en configureren, en de tweede helft doorloopt hoe demo-bronnen in uw toepassing worden ingesteld en deze van applicaties van derden gebruiken.

Serverconfiguraties

In deze sectie gaan we de afhankelijkheden installeren die nodig zijn om de Passport-bibliotheek met Laravel te laten werken. Na de installatie is er nogal wat configuratie die we moeten doorlopen zodat Laravel de Passport-bibliotheek kan detecteren.

Laten we doorgaan en de Passport-bibliotheek installeren met behulp van composer.

$ componist vereist laravel / paspoort

Dat is zo ongeveer wat de installatie van de Passport-bibliotheek betreft. Laten we er nu voor zorgen dat Laravel ervan op de hoogte is.

In samenwerking met Laravel bent u waarschijnlijk op de hoogte van het concept van een serviceprovider waarmee u services in uw toepassing kunt configureren. Wanneer u dus een nieuwe service in uw Laravel-toepassing wilt inschakelen, hoeft u alleen maar een bijbehorende serviceprovideritem toe te voegen in de config / app.php.

Als u nog geen Laravel-serviceproviders kent, raad ik u ten zeerste aan om uzelf een plezier te doen en dit inleidende artikel over de basisbeginselen van serviceproviders in Laravel te bespreken.

In ons geval hoeven we alleen de. Toe te voegen PassportServiceProvider provider naar de lijst met serviceproviders in config / app.php zoals getoond in het volgende fragment.

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

Vervolgens moeten we het trekken artisan-opdracht, die de nodige tabellen in een database voor de Passport-bibliotheek maakt.

$ php artisan migreren

Om precies te zijn, maakt het de tabellen in de database.

oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens

Vervolgens moeten we een paar openbare en persoonlijke sleutels genereren die door de Passport-bibliotheek worden gebruikt voor codering. Zoals verwacht, biedt de Passport-bibliotheek een ambachtelijk commando om het gemakkelijk te maken.

$ php artisanaal paspoort: installeer

Daar hadden sleutels voor moeten zijn gemaakt opslag / oauth-public.key en opslag / oauth-private.key. Het maakt ook een aantal demo-clientreferenties aan, waar we later op terug zullen komen.

Vooruit, laten we oauthify de bestaande gebruikersmodelklasse die Laravel gebruikt voor verificatie. Om dat te doen, moeten we het toevoegen HasApiTokens trek naar de Gebruiker modelklasse. Laten we dat doen zoals in het volgende fragment wordt getoond.

De HasApiTokens kenmerk bevat hulpmethoden die worden gebruikt om tokens in de aanvraag te valideren en de reikwijdte van de aangevraagde bronnen in de context van de momenteel geverifieerde gebruiker te controleren.

Verder moeten we de routes die door de Passport-bibliotheek worden aangeboden registreren met onze Laravel-applicatie. Deze routes worden gebruikt voor standaard OAuth2-bewerkingen zoals autorisatie, het aanvragen van toegangstokens en dergelijke.

In de opstartmethode van de app / Providers / AuthServiceProvider.php bestand, laten we de routes van de Passport-bibliotheek registreren.

... / ** * Verificatie- / autorisatiediensten registreren. * * @return void * / public function boot () $ this-> registerPolicies (); Paspoort :: routes ();  ... 

Last but not least, we moeten de api bestuurder van token naar paspoort in de config / auth.php bestand, want we gaan de Passport-bibliotheek gebruiken voor de API-authenticatie.

'bewakers' => ['web' => ['stuurprogramma' => 'sessie', 'provider' => 'gebruikers',], 'api' => ['stuurprogramma' => 'paspoort', 'provider' => 'gebruikers',],],

Tot nu toe hebben we alles gedaan wat nodig is voor zover het de OAuth2-serverconfiguratie betreft.

Stel de demo-resources in

In het vorige gedeelte hebben we al het harde werk gedaan om de OAuth2-verificatieserver in onze toepassing in te stellen. In deze sectie zullen we een demoresource instellen die kan worden aangevraagd via de API-aanroep.

We zullen proberen de zaken simpel te houden. Onze demoresource retourneert de gebruikersinformatie op voorwaarde dat er een geldig is uid parameter aanwezig in de KRIJGEN verzoek.

Laten we een controllerbestand maken app / Http / Controllers / UserController.php met de volgende inhoud.

get ("uid", 0); $ user = User :: find ($ user_id); return $ user; 

Zoals gebruikelijk, moet je ook een geassocieerde route toevoegen, die je in de. Zou moeten toevoegen routes / web.php het dossier. Maar waar we het over hebben is de API-route, en daarom heeft het een speciale behandeling nodig.

De API-routes worden gedefinieerd in de routes / api.php het dossier. Laten we dus onze aangepaste API-route toevoegen zoals in het volgende fragment wordt weergegeven.

get ('/ user', function (Request $ request) return $ request-> user ();); // aangepaste API-route Route :: middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');

Hoewel we het hebben gedefinieerd als / User / get, de effectieve API-route is / Api / user / krijgen, en dat is wat u zou moeten gebruiken wanneer u een hulpbron via die route opvraagt. De api voorvoegsel wordt automatisch afgehandeld door Laravel, en daar hoeft u zich geen zorgen over te maken!

In de volgende en de laatste sectie bespreken we hoe u klantreferenties kunt maken en de OAuth2 API kunt gebruiken.

Hoe OAuth2 API's te gebruiken

Nu we de OAuth2-server in onze applicatie hebben ingesteld, kan elke derde partij verbinding maken met onze server met OAuth en de API's gebruiken die beschikbaar zijn in onze applicatie..

Allereerst moeten toepassingen van derden zich registreren bij onze applicatie om API's te kunnen gebruiken. Met andere woorden, ze worden beschouwd als clienttoepassingen en ze zullen een klant-ID en klantgeheim ontvangen bij registratie.

De Passport-bibliotheek biedt een ambachtelijke opdracht om zonder veel moeite clientaccounts te maken. Laten we doorgaan en een demo-klantaccount maken.

$ php artisanaal paspoort: client Aan welk gebruikers-ID moet de klant worden toegewezen ?:> 1 Wat moeten we de client noemen ?:> Demo OAuth2 Client Account Waar moeten we het verzoek omleiden na autorisatie? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Nieuwe client met succes gemaakt. Client-ID: 1 Client geheim: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01

Wanneer je de artisanale leidt paspoort: client opdracht, stelt het u enkele vragen voordat u de klantaccount aanmaakt. Daarvan is er een belangrijk dat je de vraag stelt callback-URL.

De callback-URL is degene waar gebruikers na autorisatie naar het einde van de derde partij worden teruggeleid. En dat is waar de autorisatiecode die moet worden gebruikt in ruil voor de toegangstoken zal worden verzonden. We staan ​​op het punt om dat bestand in een oogwenk te creëren.

Nu zijn we klaar om OAuth2-API's in de Laravel-toepassing te testen.

Voor demonstratiedoeleinden maak ik het oauth2_client map onder de document root in de eerste plaats. Idealiter bevinden deze bestanden zich aan de kant van de externe partij die API's wil gebruiken in onze Laravel-toepassing.

Laten we het maken oauth2_client / auth_redirection.php bestand met de volgende inhoud.

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

Zorg ervoor dat u de klant identificatie en redirect_uri parameters die overeenkomen met uw eigen instellingen - de instellingen die u gebruikte tijdens het maken van de demo-klantaccount.

Laten we vervolgens de oauth2_client / callback.php bestand met de volgende inhoud.

 'authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', '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, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ($ ch); $ response = json_decode ($ result); // controleer of het antwoord access_token bevat als (isset ($ response-> access_token) && $ response-> access_token) // je wilt het access_token opslaan in de sessie hoewel ... $ access_token = $ response-> access_token; // gebruik bovenstaande token om verdere api-oproepen te maken in deze sessie of totdat de toegangstoken vervalt $ ch = curl_init (); $ url = 'http: // jouw-laravel-site -url / api / user / get '; $ header = array (' Autorisatie: Bearer '. $ access_token); $ query = http_build_query (array (' uid '=>' 1 ')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ zoekopdracht); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ result = curl_e XEC ($ ch); curl_close ($ ch); $ response = json_decode ($ resultaat); var_dump ($ result);  else // om een ​​of andere reden was het access_token niet beschikbaar // debugging goes here

Nogmaals, zorg ervoor dat u de URL's en clientreferenties aanpast volgens uw instellingen in het bovenstaande bestand.

Hoe het werkt Alles samen

In deze sectie zullen we het geheel testen vanuit het perspectief van een eindgebruiker. Als eindgebruiker staan ​​er twee toepassingen voor u:

  1. De eerste is de Laravel-applicatie waarmee u al een account hebt. Het bevat uw informatie die u kunt delen met andere applicaties van derden.
  2. De tweede is de externe client-applicatie van de demo, auth_redirection.php en callback.php, die uw informatie van de Laravel-toepassing wil ophalen met behulp van de OAuth-API.

De stroom begint bij de externe clienttoepassing. Ga je gang en open de http: //localhost/oauth2_client/auth_redirection.php URL in je browser, en dat zou je naar de Laravel-applicatie moeten leiden. Als u nog niet bent aangemeld bij de Laravel-toepassing, vraagt ​​de toepassing u dit in de eerste plaats te doen.

Nadat de gebruiker is aangemeld, geeft de toepassing de autorisatiepagina weer.

Als de gebruiker dat verzoek autoriseert, wordt de gebruiker teruggeleid naar de externe clienttoepassing op http: //localhost/oauth2_client/callback.php samen met de code als de KRIJGEN parameter die de autorisatiecode bevat.

Nadat de externe toepassing de autorisatiecode heeft ontvangen, kan deze die code uitwisselen met de Laravel-toepassing om het toegangstoken te verkrijgen. En dat is precies wat het heeft gedaan in het volgende fragment van de oauth2_client / callback.php het dossier.

$ ch = curl_init (); $ url = 'http: // uw-laravel-site-url / oauth / token'; $ params = array ('grant_type' => 'authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php' , '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, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ($ ch); $ response = json_decode ($ result);

Vervolgens controleert de toepassing van derden het antwoord van de CURL-aanvraag om te zien of deze in de eerste plaats een geldig toegangstoken bevat.

Zodra de externe toepassing het toegangstoken krijgt, zou het die token kunnen gebruiken om verdere API-aanroepen te doen om bronnen aan te vragen als dat nodig is vanuit de Laravel-toepassing. Uiteraard moet het toegangstoken worden doorgegeven in elk verzoek dat bronnen van de Laravel-toepassing vraagt.

We hebben geprobeerd om de use-case na te bootsen, omdat de applicatie van derden toegang wil hebben tot de gebruikersinformatie van de Laravel-applicatie. En we hebben al een API-eindpunt gebouwd, http: // uw-laravel-site-url / api / user / get, in de Laravel-applicatie die het mogelijk maakt.

// controleer of het antwoord access_token bevat als (isset ($ response-> access_token) && $ response-> access_token) // je wilt het access_token in de sessie opslaan via ... $ access_token = $ response-> access_token; // gebruik het bovenstaande token om verdere api-oproepen te maken in deze sessie of totdat het toegangstoken verloopt $ ch = curl_init (); $ url = 'http: // uw-laravel-site-url / api / user / get'; $ header = array ('Autorisatie: drager'. $ 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 ($ resultaat); var_dump ($ result); 

Dus dat is de volledige stroom van hoe u de OAuth2-API's in Laravel zou moeten consumeren.

En daarmee zijn we aan het einde van dit artikel gekomen.

Conclusie

Vandaag hebben we de Passport-bibliotheek in Laravel verkend, waarmee we heel eenvoudig een OAuth2-server in een applicatie kunnen opzetten. 

Voor degenen onder u die net zijn begonnen met Laravel of die op zoek zijn om uw kennis, site of applicatie uit te breiden met uitbreidingen, hebben we een aantal dingen die u kunt bestuderen in Envato Market.

Aarzel niet om uw gedachten en vragen te delen met behulp van de onderstaande feed!