În acest articol, vom explora modul în care ați putea crea un server OAuth2 cu drepturi depline în Laravel utilizând biblioteca Larapel Passport. Vom trece prin configurațiile de server necesare împreună cu un exemplu din lumea reală pentru a demonstra cum puteți consuma API-urile OAuth2.
Presupun că sunteți familiarizat cu conceptele și fluxurile de bază OAuth2, pe măsură ce le vom discuta în contextul lui Laravel. De fapt, biblioteca Larapel Passport face destul de ușor să configurați rapid un server OAuth2 în aplicația dvs. Astfel, alte aplicații ale unor terțe părți sunt capabile să consume API-urile furnizate de aplicația dvs..
În prima jumătate a articolului vom instala și configura bibliotecile necesare, iar a doua jumătate va trece prin modul de configurare a resurselor demo în aplicația dvs. și le va consuma de la aplicații de la terți.
În această secțiune, vom instala dependențele necesare pentru ca biblioteca Passport să lucreze cu Laravel. După instalare, avem destulă configurație de care trebuie să trecem, pentru ca Laravel să poată detecta biblioteca Passport.
Să mergem mai departe și să instalăm biblioteca Passport utilizând compozitorul.
$ compozitorul necesită laravel / pașaport
Este destul de mult în ceea ce privește instalarea bibliotecii Passport. Acum, să ne asigurăm că Laravel știe despre asta.
Lucrați cu Laravel, probabil sunteți conștient de conceptul de furnizor de servicii care vă permite să configurați servicii în aplicația dvs. Astfel, ori de câte ori doriți să activați un serviciu nou în aplicația dvs. Laravel, trebuie doar să adăugați o intrare asociată unui furnizor de servicii în config / app.php
.
Dacă nu știți încă furnizorii de servicii Laravel, aș recomanda cu tărie să vă faceți o favoare și să treceți prin acest articol introductiv care explică elementele de bază ale furnizorilor de servicii din Laravel.
În cazul nostru, trebuie doar să adăugăm PassportServiceProvider
furnizorul pe lista furnizorilor de servicii din România config / app.php
așa cum se arată în fragmentul următor.
... Furnizori de servicii Laravel Framework ... * / Illuminate \ Auth \ AuthServiceProvider :: clasa, Illuminate \ Broadcasting \ BroadcastServiceProvider :: clasa, Illuminate \ Bus \ BusServiceProvider :: clasa, Illuminate \ Cache \ CacheServiceProvider: : clasa, iluminare \ Foundation \ Providers \ ConsoleSupportServiceProvider :: clasa, Illuminate \ Cookie \ CookieServiceProvider :: clasa, Illuminate \ Database \ DatabaseServiceProvider :: clasa, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ FilesystemServiceProvider :: class, Iluminare \ Foundation \ Providers \ FoundationServiceProvider :: clasă, iluminare \ Hashing \ HashServiceProvider :: clasă, iluminare \ Mail \ MailServiceProvider :: clasă, iluminare \ Notificări \ NotificationServiceProvider :: clasă, iluminare \ Pagination \ PaginationServiceProvider :: class, Illuminate \ \ PipelineServiceProvider :: clasă, iluminare \ Queue \ QueueServiceProvider :: clasă, iluminare \ Redis \ RedisServiceProvider :: clasă, iluminare \ Auth \ parole \ PasswordResetServ IceProvider :: Class, Illuminate \ Session \ SessionServiceProvider :: Clasa, Iluminare \ Traducere \ TraducereServiceProvider :: Class, Illuminate \ Validation \ ValidationServiceProvider :: Class, Illuminate \ Vizualizare \ ViewServiceProvider :: class, / * * Laravel \ Tinker \ TinkerServiceProvider :: Class, / * * Furnizori de servicii de aplicații ... * / App \ Providers \ AppServiceProvider :: class, App \ Providers \ AuthServiceProvider :: class, App \ Providers \ BroadcastServiceProvider :: class, App \ Providers \ EventServiceProvider :: clasa, App \ Providers \ RouteServiceProvider :: clasa, Laravel \ Passport \ PassportServiceProvider :: clasa,], ...
Apoi, trebuie să rulați migra
comanda artisan, care creează tabelele necesare într-o bază de date pentru biblioteca Passport.
$ php artizan migrează
Pentru a fi mai precis, se creează după tabelele din baza de date.
oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens
Apoi, trebuie să generăm o pereche de chei publice și private care vor fi folosite de biblioteca Passport pentru criptare. Așa cum era de așteptat, biblioteca Passport oferă o comandă artizanală pentru ao crea ușor.
$ php artizan pașaport: instalare
Asta ar fi trebuit să creeze chei la depozitare / OAuth-public.key
și depozitare / OAuth-private.key
. Creează, de asemenea, niște acreditări de client demo pe care le vom reveni mai târziu.
Mergând înainte, hai să mergem oauthify clasa de modele utilizator existente pe care Laravel o folosește pentru autentificare. Pentru a face acest lucru, trebuie să adăugăm HasApiTokens
trăsătură la Utilizator
clasa de modele. Să facem asta așa cum se arată în fragmentul următor.
HasApiTokens
trait conține metode de ajutor care sunt folosite pentru validarea token-urilor în cerere și verificarea domeniului de aplicare a resurselor solicitate în contextul utilizatorului curent autentificat.Mai mult, trebuie să înregistrăm rutele oferite de biblioteca Passport cu aplicația noastră Laravel. Aceste rute vor fi utilizate pentru operațiuni standard OAuth2 cum ar fi autorizația, solicitând token-uri de acces și altele asemenea.
În metoda de încărcare a
app / Furnizori / AuthServiceProvider.php
fișier, să înregistrăm rutele bibliotecii Passport.... / ** * Înregistrați orice servicii de autentificare / autorizare. * * @return void * / boot public funcția () $ this-> registerPolicies (); Pașaport :: căi (); ...Nu în ultimul rând, trebuie să schimbăm
api
conducător auto de la token la pașaport înconfig / auth.php
, deoarece vom folosi biblioteca Passport pentru autentificarea API."paznic" => ['web' => ['driver' => 'session', 'provider' => 'users', 'api' => "utilizatori",],],Până acum, am făcut tot ce este necesar în ceea ce privește configurația serverului OAuth2.
Configurați resursele demo
În secțiunea anterioară, am depus toate eforturile pentru a configura serverul de autentificare OAuth2 în aplicația noastră. În această secțiune, vom configura o resursă demo care ar putea fi solicitată prin apelul API.
Vom încerca să păstrăm lucrurile simple. Resursa noastră demonstrativă returnează informațiile despre utilizator cu condiția să fie valabilă
uid
parametru prezent înOBȚINE
cerere.Să creăm un fișier de controler
app / HTTP / Controllers / UserController.php
cu următorul conținut.obține ("uid", 0); $ user = Utilizator :: find ($ user_id); return $ user;Ca de obicei, trebuie să adăugați și un traseu asociat, pe care ar trebui să îl adăugați în
rute / web.php
fişier. Dar despre noi vorbim este traseul API și, prin urmare, este nevoie de un tratament special.Căile API sunt definite în
rute / api.php
fişier. Deci, hai să mergem mai departe și să adăugăm ruta noastră API personalizată așa cum este prezentat în fragmentul următor.get ('/ user', funcția (Cerere $ request) return $ request-> user ();); // route API personalizat Route :: middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');Deși am definit-o ca fiind
/ Utilizator / get
, traseul eficient API este/ Api / utilizator / get
, și asta ar trebui să utilizați atunci când solicitați o resursă pe acel traseu.api
prefixul este gestionat automat de Laravel, și nu trebuie să vă faceți griji în legătură cu acest lucru!În următoarea și ultima secțiune, vom discuta cum puteți crea acreditările clientului și puteți consuma API-ul OAuth2.
Cum să consumați API-uri OAuth2
Acum că am creat serverul OAuth2 în aplicația noastră, orice terță parte se poate conecta la serverul nostru cu OAuth și poate consuma API-urile disponibile în aplicația noastră.
În primul rând, aplicațiile terță parte trebuie să se înregistreze împreună cu aplicația noastră pentru a putea consuma API-uri. Cu alte cuvinte, acestea sunt considerate ca aplicații client și vor primi secret de client și client la înregistrare.
Biblioteca Passport oferă o comandă artizanală pentru a crea conturi client fără prea multă greutate. Să mergem mai departe și să creăm un cont de client demo.
$ php pașaport artizan: client la care cod de utilizator trebuie să li se atribuie clientul ?:> 1 Ce ar trebui să numim clientul ?:> Demo Contul clientului OAuth2 Unde ar trebui să redirecționăm cererea după autorizare? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Client nou creat cu succes. ID client: 1 Client secret: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01Când conduci artizanul
pașaport: client
comanda, vă cere câteva întrebări înainte de a crea contul clientului. Dintre acestea, este unul important care vă întreabăcallback URL
.
callback URL
este cea în care utilizatorii vor fi redirecționați înapoi la sfârșitul unei terțe părți după autorizare. Și acolo va fi trimis codul de autorizare care se presupune că va fi folosit în schimbul simbolului de acces. Suntem pe punctul de a crea acest fișier într-un moment.Acum, suntem gata să testăm API-urile OAuth2 în aplicația Laravel.
În scopuri demonstrative, voi crea
oauth2_client
în primul rând, sub rădăcina documentului. În mod ideal, aceste fișiere vor fi amplasate la sfârșitul unei terțe părți care dorește să consume API-uri în aplicația noastră Laravel.Să creăm
oauth2_client / auth_redirection.php
fișier cu următorul conținut.'1', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', 'response_type' => 'cod', 'scope' => /your-laravel-site-url/oauth/authorize?'.$query);Asigurați-vă că modificați
CLIENT_ID
șiredirect_uri
parametrii pentru a reflecta propriile setări - acelea pe care le-ați utilizat în crearea contului client demo.Apoi, să creați
oauth2_client / callback.php
fișier cu următorul conținut.'authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => '_REQUEST [' cod "]); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; dacă (is_array ($ params) && count ($ params)) foreach ($ params ca $ cheie => valoare $) $ params_string. = $ key. ; $ curl_setopt ($ ch, CURLOPT_POST, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ($) ($ answer => access_token) && $ răspuns-> access_token) // doriți să stocați access_token în sesiune deși ... $ access_token = $ response-> access_token; // folosiți tokenul de mai sus pentru a efectua alte apeluri api în această sesiune sau până când expiră tokenul de acces $ ch = curl_init (); $ url = 'http: // your-laravel-site ($ u, 'CURLOPT_URL', '$', '$', '$'), $ header = array (' $ curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ result = curl_e XEC ($ ch); curl_close ($ ch); $ răspuns = json_decode ($ rezultat); var_dump ($ rezultat); altceva // dintr-un motiv, access_token nu a fost disponibil // debugging goes hereDin nou, asigurați-vă că ajustați adresele URL și datele de conectare ale clientului în funcție de configurația dvs. din fișierul de mai sus.
Cum funcționează în totalitate
În această secțiune, o vom testa cu totul din perspectiva unui utilizator final. Ca utilizator final, există două aplicații în fața dvs.:
- Prima este aplicația Laravel cu care aveți deja un cont. Acesta vă ține informațiile pe care le puteți partaja cu alte aplicații ale unor terțe părți.
- Al doilea este aplicația client terță parte demo,
auth_redirection.php
șicallback.php
, care dorește să vă aducă informațiile din aplicația Laravel utilizând API-ul OAuth.Fluxul începe de la aplicația client terță parte. Mergeți mai departe și deschideți http: //localhost/oauth2_client/auth_redirection.php în browser-ul dvs. și că ar trebui să vă redirecționați către aplicația Laravel. Dacă nu sunteți deja conectat (ă) la aplicația Laravel, aplicația vă va cere să faceți acest lucru în primul rând.
Odată ce utilizatorul este conectat, aplicația afișează pagina de autorizare.
Dacă utilizatorul autorizează această solicitare, utilizatorul va fi redirecționat înapoi la aplicația client terță parte la http: //localhost/oauth2_client/callback.php împreună cu
cod
dupa cumOBȚINE
parametru care conține codul de autorizare.Odată ce aplicația terță parte primește codul de autorizare, ar putea schimba acest cod cu aplicația Laravel pentru a obține indicativul de acces. Și tocmai a făcut exact ceea ce a făcut în fragmentul de mai jos
oauth2_client / callback.php
fişier.$ ch = curl_init (); $ url = 'http: // dvs.-laravel-site-url / oauth / token'; $ params = array ('grant_type' => 'authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => , 'code' => $ _REQUEST ['code']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; dacă (is_array ($ params) && count ($ params)) foreach ($ params ca $ cheie => valoare $) $ params_string. = $ key. ; $ curl_setopt ($ ch, CURLOPT_POST, count ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ($) ch); $ răspuns = json_decode ($ rezultat);Apoi, aplicația terță parte verifică răspunsul solicitării CURL pentru a vedea dacă conține în prealabil un jeton de acces valid.
Imediat ce aplicația terță parte primește simbolul de acces, ar putea utiliza acest jeton pentru a efectua alte apeluri API pentru a solicita resursele după cum este necesar din aplicația Laravel. Desigur, tokenul de acces trebuie să fie transmis în fiecare solicitare care solicită resurse din aplicația Laravel.
Am încercat să imităm cazul în care cererea terță parte dorește să acceseze informațiile despre utilizatori din aplicația Laravel. Și am construit deja un parametru API, http: // your-laravel-site-url / api / user / get, în aplicația Laravel care o facilitează.
// verificați dacă răspunsul include access_token dacă (isset ($ response-> access_token) && $ answer-> access_token) // doriți să stocați access_token în sesiune, deși ... $ access_token = $ response-> access_token; // utilizați tokenul de mai sus pentru a efectua alte apeluri api în această sesiune sau până când expiră tokenul de acces $ ch = curl_init (); $ url = 'http: // dvs.-laravel-site-url / api / user / get'; $ header = array ("Autorizare: purtător" $ access_token); $ query = http_build_query (array ('uid' => '1')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ interogare); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, antet $); $ rezultat = curl_exec ($ ch); curl_close ($ ch); $ răspuns = json_decode ($ rezultat); var_dump ($ rezultat);Deci asta este fluxul complet al modului în care ar trebui să consumi API-urile OAuth2 din Laravel.
Și cu asta, am ajuns la sfârșitul acestui articol.
Concluzie
Astăzi, am explorat biblioteca Passport din Laravel, care ne permite să configuram foarte ușor un server OAuth2 într-o aplicație.
Pentru cei care sunteți fie doar începători cu Laravel, fie căutați să vă extindeți cunoștințele, site-ul sau aplicația cu extensii, avem o varietate de lucruri pe care le puteți studia în piața Envato.
Nu ezitați să vă împărtășiți gândurile și întrebările folosind feedul de mai jos!