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.
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 deconfig / 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 deKRIJGEN
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. Deapi
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: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01Wanneer 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 steltcallback-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
enredirect_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 hereNogmaals, 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:
- 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.
- De tweede is de externe client-applicatie van de demo,
auth_redirection.php
encallback.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 deKRIJGEN
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!