Sette opp en OAuth2-server ved hjelp av Passport i Laravel

I denne artikkelen skal vi utforske hvordan du kan konfigurere en fullverdig OAuth2-server i Laravel ved hjelp av Laravel Passport-biblioteket. Vi vil gjennomgå de nødvendige serverkonfigurasjonene sammen med et ekte eksempel for å demonstrere hvordan du kan konsumere OAuth2-APIer.

Jeg antar at du er kjent med de grunnleggende OAuth2-konseptene og -flyten som vi skal diskutere dem i sammenheng med Laravel. Faktisk gjør Laravel Passport-biblioteket det ganske enkelt å raskt sette opp en OAuth2-server i din søknad. Dermed kan andre tredjepartsapplikasjoner forbruke APIer som er levert av søknaden din.

I første halvdel av artikkelen installerer og konfigurerer vi de nødvendige bibliotekene, og den andre halvdelen går gjennom hvordan du konfigurerer demoressurser i søknaden din og konsumerer dem fra tredjepartsprogrammer.

Serverkonfigurasjoner

I denne delen skal vi installere de avhengighetene som kreves for å gjøre passportbiblioteket til hjelp med Laravel. Etter installasjonen er det ganske mye konfigurasjon som vi må gå gjennom, slik at Laravel kan oppdage Passport-biblioteket.

La oss fortsette og installere Passport-biblioteket ved hjelp av komponist.

$ komponist krever laravel / pass

Det er ganske mye så langt som passportbiblioteket installeres. La oss nå sørge for at Laravel vet om det.

Arbeide med Laravel, du er sikkert klar over konseptet med en tjenesteleverandør som lar deg konfigurere tjenester i søknaden din. Når du vil aktivere en ny tjeneste i Laravel-applikasjonen din, må du bare legge til en tilhørende tjenesteleverandørinngang i config / app.php.

Hvis du ikke er klar over Laravel-tjenesteleverandører ennå, vil jeg sterkt anbefale at du gjør deg selv en tjeneste og gå gjennom denne innledende artikkelen som forklarer grunnleggende om tjenesteleverandører i Laravel.

I vårt tilfelle trenger vi bare å legge til PassportServiceProvider leverandør til listen over tjenesteleverandører i config / app.php som vist i følgende utdrag.

... 'leverandører' => [/ * * Laravel Work Service Providers ... * / Illuminate \ Auth \ AuthServiceProvider :: klasse, Illuminate \ Broadcasting \ BroadcastServiceProvider :: klasse, Illuminate \ buss \ BusServiceProvider :: klasse, Illuminate \ Cache \ CacheServiceProvider: : klasse, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: klasse, Illuminate \ Cookie \ CookieServiceProvider :: klasse, Illuminate \ Database \ DatabaseServiceProvider :: klasse, Illuminate \ kryptering \ EncryptionServiceProvider :: klasse, Illuminate \ Filesystem \ FilesystemServiceProvider :: klasse, belyse \ Foundation \ Providers \ FoundationServiceProvider :: klasse, Illuminate \ Hashing \ HashServiceProvider :: klasse, Illuminate \ Mail \ MailServiceProvider :: klasse, Illuminate \ Meldinger \ NotificationServiceProvider :: klasse, Illuminate \ paginering \ PaginationServiceProvider :: klasse, Illuminate \ Pipeline \ PipelineServiceProvider :: Klasse, Lys \ Kjøre \ QueueServiceProvider :: Klasse, Lys \ Redis \ RedisServiceProvider :: Klasse, Lyser \ Auth \ Passord \ PasswordResetServ iceProvider :: class, Illuminate \ Session \ SessionServiceProvider :: klassen, Lyser \ Oversettelse \ OversettelseServiceProvider :: klasse, Lyser \ Validering \ ValidasjonServiceProvider :: klasse, Lyser \ Vis \ VisServiceProvider :: klasse, / * * Pakkeleverandører ... * / Laravel \ Tinker \ TinkerServiceProvider :: klasse, / * * Application Service Providers ... * / App \ leverandører \ AppServiceProvider :: klasse, App \ leverandører \ AuthServiceProvider :: klasse, App \ leverandører \ BroadcastServiceProvider :: klasse, App \ Providers \ EventServiceProvider :: klasse, App \ Providers \ RouteServiceProvider :: klasse, Laravel \ Passport \ PassportServiceProvider :: klasse,], ... 

Deretter må vi kjøre migrere håndverkskommando, som skaper de nødvendige tabellene i en database for passportbiblioteket.

$ php håndverk migrere

For å være presis oppretter den følgende tabellene i databasen.

oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens

Deretter må vi generere et par offentlige og private nøkler som vil bli brukt av Passport-biblioteket for kryptering. Passport-biblioteket, som forventet, gir en håndverkskommando for å lage det enkelt.

$ php artisan pass: installere

Det burde ha skapt nøkler på lagring / oauth-public.key og lagring / oauth-private.key. Det skaper også noen demo klient legitimasjon som vi kommer tilbake til senere.

Fortsett, la oss oauthify den eksisterende brukermodellklassen som Laravel bruker til godkjenning. For å gjøre det, må vi legge til HasApiTokens trekk til Bruker modell klasse. La oss gjøre det som vist i følgende utdrag.

De HasApiTokens Egenskapen inneholder hjelpemetoder som brukes til å validere tokens i forespørselen, og kontrollere omfanget av ressurser som blir forespurt i sammenheng med den for øyeblikket godkjente brukeren.

Videre må vi registrere ruter fra Passport-biblioteket med Laravel-søknaden. Disse ruter vil bli brukt til standard OAuth2 operasjoner som autorisasjon, forespørsel om tilgangstoken og lignende.

I oppstartsmetoden til app / Leverandører / AuthServiceProvider.php fil, la oss registrere ruter på passportbiblioteket.

... / ** * Registrer eventuelle godkjenning / autorisasjonstjenester. * * @return void * / public function boot () $ this-> registerPolicies (); Pass :: ruter ();  ... 

Sist men ikke minst, vi må endre api sjåfør fra token til pass i config / auth.php fil, da vi skal bruke Passport-biblioteket for API-autentisering.

'' '' ''> '' '' '>' '' ''> '' '' '>' '' '' => 'brukere',],],

Så langt har vi gjort alt som kreves så langt som OAuth2-serverkonfigurasjonen angår.

Sett opp demoressursene

I den forrige delen gjorde vi alt det harde arbeidet med å konfigurere OAuth2-godkjenningsserveren i vår søknad. I denne delen vil vi sette opp en demo ressurs som kan bli bedt om via API-anropet.

Vi vil prøve å holde ting enkelt. Vår demo ressurs returnerer brukerinformasjonen forutsatt at det er gyldig uid parameter tilstede i be om.

La oss lage en kontrollerfil app / Http / kontrollere / UserController.php med følgende innhold.

få ("uid", 0); $ user = Bruker :: finn ($ user_id); returnere $ bruker; 

Som vanlig må du også legge til en tilknyttet rute, som du skal legge til i ruter / web.php fil. Men det vi snakker om, er API-ruten, og det krever derfor spesiell behandling.

API-ruter er definert i ruter / api.php fil. Så la oss gå videre og legge til vår egendefinerte API-rute som vist i følgende utdrag.

få ('/ bruker', funksjon (forespørsel $ forespørsel) return $ request-> user ();); // tilpasset API rute Rute :: middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');

Selv om vi har definert det som / User / get, Den effektive API-ruten er / Api / bruker / få, og det er det du bør bruke når du ber om en ressurs over den ruten. De api prefiks håndteres automatisk av Laravel, og du trenger ikke å bekymre deg for det!

I neste og siste avsnitt diskuterer vi hvordan du kan opprette klientlegitimasjon og konsumere OAuth2 API.

Slik bruker du OAuth2-APIer

Nå som vi har konfigurert OAuth2-serveren i vår søknad, kan en tredjepart koble til vår server med OAuth og konsumere APIene som er tilgjengelige i vår søknad.

Først og fremst må tredjepartsapplikasjoner registrere seg hos vårt program for å kunne konsumere APIer. Med andre ord betraktes de som klientapplikasjoner, og de vil motta en klientidentitet og klienthemmelighet ved registrering.

Passport-biblioteket gir en håndverkskommando for å opprette kundekontoer uten mye stress. La oss gå videre og opprette en demo-klientkonto.

$ php artisan pass: klient Hvilken bruker-ID skal kunden tilordnes ?:> 1 Hva skal vi nevne klienten ?:> Demo OAuth2 Client-konto Hvor skal vi omdirigere forespørselen etter autorisasjon? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Ny klient ble opprettet. Klient-ID: 1 Klientshemmelig: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01

Når du kjører håndverkeren pass: klient kommando, det spør deg noen spørsmål før du oppretter klientkontoen. Ut av dem er det en viktig som spør deg tilbakeringingsadresse.

De tilbakeringingsadresse er den der brukerne vil bli omdirigert tilbake til tredjepartsenden etter godkjenning. Og det er her autorisasjonskoden som skal brukes i bytte for tilgangstoken, vil bli sendt. Vi er i ferd med å lage den filen på et øyeblikk.

Nå er vi klare til å teste OAuth2-APIer i Laravel-programmet.

For demonstrasjonsformål skal jeg opprette oauth2_client katalog under dokumentrotten i utgangspunktet. Ideelt sett vil disse filene være plassert på tredjepartsenden som ønsker å konsumere APIer i Laravel-applikasjonen.

La oss lage oauth2_client / auth_redirection.php fil med følgende innhold.

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

Pass på at du endrer klient-ID og redirect_uri parametere for å gjenspeile dine egne innstillinger - de som du brukte mens du opprettet demo-klientkontoen.

Neste, la oss lage oauth2_client / callback.php fil med følgende innhold.

 'Authorization_code', 'CLIENT_ID' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', 'kode' => $ _REQUEST [' kode ']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; hvis (is_array ($ params) && count ($ params)) foreach ($ params som $ key => $ verdi) $ params_string. = $ key. '='. $ verdi. '&' ; RTRIM ($ params_string, '&'); curl_setopt ($ lm, CURLOPT_POST, teller ($ parametere)); curl_setopt ($ lm, CURLOPT_POSTFIELDS, $ params_string); $ resultat = curl_exec ($ CH); curl_close ($ ch = $ response = json_decode ($ result); // kontroller om svaret inkluderer access_token hvis (isset ($ response-> access_token) && $ response-> access_token) // du vil lagre access_token i sesjonen selv om ... $ access_token = $ response-> access_token; // bruk over token for å gjøre ytterligere api-anrop i denne økten eller til tilgangstoken utløper $ ch = curl_init (); $ url = 'http: // din-laravel-siden -url / api / user / get '; $ header = array (' Authorization: Bearer '. $ access_token); $ query = http_build_query (array (' uid '=>' 1 ')); curl_setopt ($ ch, CURLOPT_URL, $ url. '?'. $ spørring); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ resultat = curl_e XEC ($ ch); curl_close ($ ch); $ respons = json_decode ($ resultat); var_dump ($ resultat);  else // av en eller annen grunn, access_token var ikke tilgjengelig // feilsøking går her

Igjen, sørg for å justere nettadressene og klientlegitimasjonene i henhold til oppsettet ditt i filen ovenfor.

Slik fungerer det helt

I dette avsnittet tester vi det helt fra et sluttbrukerperspektiv. Som sluttbruker er det to applikasjoner foran deg:

  1. Den første er Laravel-programmet som du allerede har en konto med. Den inneholder informasjonen du kan dele med andre tredjeparts applikasjoner.
  2. Den andre er demo-tredjepartsklientprogrammet, auth_redirection.php og callback.php, som ønsker å hente informasjonen fra Laravel-programmet ved hjelp av OAuth API.

Strømmen starter fra tredjepartsklientprogrammet. Gå videre og åpne http: //localhost/oauth2_client/auth_redirection.php URL i nettleseren din, og det skal omdirigere deg til Laravel-programmet. Hvis du ikke allerede er logget inn i Laravel-søknaden, vil programmet be deg om å gjøre det i utgangspunktet.

Når brukeren er logget inn, viser søknaden autorisasjonssiden.

Hvis brukeren tillater denne forespørselen, blir brukeren omdirigert tilbake til tredjeparts klientprogrammet på http: //localhost/oauth2_client/callback.php sammen med kode som parameter som inneholder autorisasjonskoden.

Når tredjepartsprogrammet mottar autorisasjonskoden, kan den bytte den koden med Laravel-programmet for å få tilgangstoken. Og det er akkurat det det har gjort i følgende utdrag av oauth2_client / callback.php fil.

$ ch = curl_init (); $ url = 'http: // din-laravel-side-url / oauth / token'; $ params = array ('grant_type' => 'authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php' , 'kode' => $ _REQUEST ['kode']); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; hvis (is_array ($ params) && count ($ params)) foreach ($ params som $ key => $ verdi) $ params_string. = $ key. '='. $ verdi. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, telle ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ch); $ respons = json_decode ($ resultat);

Deretter sjekker tredjepartsprogrammet svaret fra CURL-forespørselen for å se om det inneholder et gyldig tilgangstoken i utgangspunktet.

Så snart tredjepartsprogrammet får tilgangstoken, kan det bruke token til å gjøre ytterligere API-anrop for å be om ressurser etter behov fra Laravel-programmet. Selvfølgelig må tilgangstoken sendes i hver forespørsel som ber om ressurser fra Laravel-søknaden.

Vi har forsøkt å etterligne brukssaken ved at tredjepartsprogrammet vil ha tilgang til brukerinformasjonen fra Laravel-søknaden. Og vi har allerede bygget et API-endepunkt, http: // your-laravel-site-url / api / user / get, i Laravel-programmet som letter det.

// Sjekk om svaret inkluderer access_token hvis (isset ($ response-> access_token) && $ response-> access_token) // du vil lagre access_token i økten skjønt ... $ access_token = $ response-> access_token; // bruk over token for å gjøre ytterligere api-anrop i denne økten eller til tilgangstoken utløper $ ch = curl_init (); $ url = 'http: // din-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. '?'. $ spørring); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt ($ ch, CURLOPT_HTTPHEADER, $ header); $ resultat = curl_exec ($ ch); curl_close ($ ch); $ respons = json_decode ($ resultat); var_dump ($ resultat); 

Så det er den fullstendige strømmen av hvordan du skal konsumere OAuth2-APIer i Laravel.

Og med det har vi nådd slutten av denne artikkelen.

Konklusjon

I dag har vi utforsket Passport-biblioteket i Laravel, noe som gjør at vi kan sette opp en OAuth2-server i en applikasjon veldig enkelt. 

For de av dere som enten bare er i gang med Laravel eller ser ut til å utvide din kunnskap, nettsted eller søknad med utvidelser, har vi en rekke ting du kan studere i Envato Market.

Ikke nøl med å dele dine tanker og spørsmål ved å bruke feedet under!