In questo articolo, esploreremo come configurare un server OAuth2 completo in Laravel usando la libreria Laravel Passport. Analizzeremo le configurazioni server necessarie insieme a un esempio reale per dimostrare come è possibile utilizzare le API OAuth2.
Presumo che tu abbia familiarità con i concetti e il flusso di base di OAuth2 mentre li discuteremo nel contesto di Laravel. In effetti, la libreria Laravel Passport rende piuttosto semplice configurare rapidamente un server OAuth2 nell'applicazione. Pertanto, altre applicazioni di terze parti sono in grado di utilizzare le API fornite dalla tua applicazione.
Nella prima metà dell'articolo, installeremo e configureremo le librerie necessarie e la seconda parte spiegherà come impostare le risorse demo nella tua applicazione e utilizzarle da applicazioni di terze parti.
In questa sezione, installeremo le dipendenze necessarie per far funzionare la libreria di Passport con Laravel. Dopo l'installazione, c'è un bel po 'di configurazione che dovremo fare in modo che Laravel possa rilevare la libreria di Passport.
Andiamo avanti e installiamo la libreria Passport usando il compositore.
$ compositore richiede laravel / passaporto
Questo è praticamente l'installazione della libreria Passport. Ora assicuriamoci che Laravel lo sappia.
Lavorando con Laravel, probabilmente sei a conoscenza del concetto di un fornitore di servizi che ti consente di configurare i servizi nella tua applicazione. Pertanto, ogni volta che si desidera abilitare un nuovo servizio nella propria applicazione Laravel, è sufficiente aggiungere una voce del fornitore di servizi associato in config / app.php
.
Se non sei ancora a conoscenza dei fornitori di servizi Laravel, ti consiglio caldamente di fare un favore a te stesso e di leggere questo articolo introduttivo che spiega le basi dei fornitori di servizi a Laravel.
Nel nostro caso, abbiamo solo bisogno di aggiungere il PassportServiceProvider
fornitore all'elenco dei fornitori di servizi in config / app.php
come mostrato nel seguente frammento.
... 'providers' => [/ * * Laravel Framework Service Provider ... * / Illuminate \ Auth \ AuthServiceProvider :: classe, Illuminate \ Broadcasting \ BroadcastServiceProvider :: class, Illuminate \ Bus \ BusServiceProvider :: class, Illuminate \ Cache \ CacheServiceProvider: : classe, Illuminate \ Foundation \ Providers \ ConsoleSupportServiceProvider :: classe, Illuminate \ Cookie \ CookieServiceProvider :: classe, Illuminate \ Database \ DatabaseServiceProvider :: classe, Illuminate \ Encryption \ EncryptionServiceProvider :: class, Illuminate \ Filesystem \ FilesystemServiceProvider :: class, Illuminate \ Foundation \ Providers \ FoundationServiceProvider :: classe, Illuminate \ Hashing \ HashServiceProvider :: classe, Illuminate \ Mail \ MailServiceProvider :: classe, Illuminate \ Notifications \ NotificationServiceProvider :: classe, Illuminate \ Pagination \ PaginationServiceProvider :: class, Illuminate \ Pipeline \ PipelineServiceProvider :: class, Illuminate \ Queue \ QueueServiceProvider :: class, Illuminate \ Redis \ RedisServiceProvider :: class, Illuminate \ Auth \ Passwords \ PasswordResetServ iceProvider :: classe, Illuminate \ Session \ SessionServiceProvider :: classe, Illuminate \ Translation \ TranslationServiceProvider :: classe, Illuminate \ Validation \ ValidationServiceProvider :: class, Illuminate \ View \ ViewServiceProvider :: class, / * * Provider di servizi di pacchetti ... * / Laravel \ Tinker \ TinkerServiceProvider :: class, / * * Provider di servizi applicativi ... * / App \ Provider \ AppServiceProvider :: classe, App \ Provider \ AuthServiceProvider :: classe, App \ Provider \ BroadcastServiceProvider :: classe, App \ Provider \ EventServiceProvider :: class, App \ Providers \ RouteServiceProvider :: class, Laravel \ Passport \ PassportServiceProvider :: class,], ...
Quindi, dobbiamo eseguire il migrare
comando artisan, che crea le tabelle necessarie in un database per la libreria Passport.
$ php artisan migrate
Per essere precisi, crea seguendo le tabelle nel database.
oauth_access_tokens oauth_auth_codes oauth_clients oauth_personal_access_clients oauth_refresh_tokens
Successivamente, è necessario generare una coppia di chiavi pubbliche e private che verranno utilizzate dalla libreria Passport per la crittografia. Come previsto, la libreria Passport fornisce un comando artigianale per crearlo facilmente.
Passaporto artigianale $ php: installare
Questo dovrebbe aver creato le chiavi in stoccaggio / OAuth-public.key
e stoccaggio / OAuth-private.key
. Crea anche alcune credenziali per client dimostrativi su cui torneremo più tardi.
Andando avanti, andiamo oauthify la classe del modello utente esistente che Laravel utilizza per l'autenticazione. Per fare ciò, dobbiamo aggiungere il HasApiTokens
tratto al Utente
classe del modello. Facciamolo come mostrato nello snippet seguente.
Il
HasApiTokens
tratto contiene metodi di supporto che vengono utilizzati per convalidare i token nella richiesta e controllare l'ambito delle risorse richieste nel contesto dell'utente correntemente autenticato.Inoltre, dobbiamo registrare i percorsi forniti dalla libreria Passport con la nostra applicazione Laravel. Queste rotte verranno utilizzate per operazioni standard OAuth2 come l'autorizzazione, la richiesta di token di accesso e simili.
Nel metodo di avvio di
app / fornitori / AuthServiceProvider.php
file, registriamo i percorsi della libreria Passport.... / ** * Registrazione di tutti i servizi di autenticazione / autorizzazione. * * @return void * / public function boot () $ this-> registerPolicies (); Passport :: percorsi (); ...Ultimo ma non meno importante, abbiamo bisogno di cambiare il
api
autista dal token al passaporto nelconfig / auth.php
file, poiché useremo la libreria Passport per l'autenticazione API.'guards' => ['web' => ['driver' => 'sessione', 'fornitore' => 'utenti',], 'api' => ['driver' => 'passaporto', 'fornitore' => 'utenti',],],Finora, abbiamo fatto tutto il necessario per quanto riguarda la configurazione del server OAuth2.
Impostare le risorse demo
Nella sezione precedente, abbiamo fatto tutto il lavoro necessario per configurare il server di autenticazione OAuth2 nella nostra applicazione. In questa sezione, configureremo una risorsa demo che potrebbe essere richiesta tramite la chiamata API.
Cercheremo di mantenere le cose semplici. La nostra risorsa demo restituisce le informazioni dell'utente a condizione che ci sia un valido
uid
parametro presente nelOTTENERE
richiesta.Creiamo un file controller
App / HTTP / Controller / UserController.php
con i seguenti contenuti.get ("uid", 0); $ user = User :: find ($ user_id); restituire $ utente;Come al solito, devi aggiungere anche un percorso associato, che dovresti aggiungere nel
percorsi / web.php
file. Ma quello di cui stiamo parlando è la rotta dell'API, e quindi ha bisogno di un trattamento speciale.Le rotte API sono definite nel
percorsi / api.php
file. Quindi, proseguiamo e aggiungiamo la nostra rotta API personalizzata come mostrato nel seguente snippet.get ('/ user', function (Request $ request) return $ request-> user ();); // percorso dell'API personalizzato Route :: middleware ('auth: api') -> get ('/ user / get', 'UserController @ get');Sebbene lo abbiamo definito come
/ User / get
, la rotta dell'API effettiva è/ Api / user / get
, ed è quello che dovresti usare quando richiedi una risorsa su quella rotta. Ilapi
il prefisso viene gestito automaticamente da Laravel e non devi preoccuparti di questo!Nella prossima e ultima sezione, discuteremo come creare credenziali client e utilizzare l'API OAuth2.
Come consumare le API OAuth2
Ora che abbiamo configurato il server OAuth2 nella nostra applicazione, qualsiasi terza parte può connettersi al nostro server con OAuth e consumare le API disponibili nella nostra applicazione.
Prima di tutto, le applicazioni di terze parti devono registrarsi con la nostra applicazione per poter utilizzare API. In altre parole, sono considerati come applicazioni client e riceveranno un ID client e un segreto client al momento della registrazione.
La libreria Passport fornisce un comando artisan per creare account client senza troppi problemi. Andiamo avanti e creare un account cliente demo.
$ php artisan passport: client A quale ID utente deve essere assegnato il client ?:> 1 Quale nome dovremmo chiamare il cliente ?:> Demo OAuth2 Account cliente Dove dovremmo reindirizzare la richiesta dopo l'autorizzazione? [http: // localhost / auth / callback]:> http: //localhost/oauth2_client/callback.php Nuovo client creato correttamente. ID client: 1 Segreto client: zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01Quando gestisci l'artigiano
Passaporto: cliente
comando, ti fa alcune domande prima di creare l'account cliente. Di questi, ce n'è uno importante che ti chiede ilURL di richiamata
.Il
URL di richiamata
è quella in cui gli utenti verranno reindirizzati al fine di terze parti dopo l'autorizzazione. Ed è qui che verrà inviato il codice di autorizzazione che dovrebbe essere utilizzato in cambio del token di accesso. Stiamo per creare quel file in un attimo.Ora siamo pronti a testare le API OAuth2 nell'applicazione Laravel.
A scopo dimostrativo, creerò il
oauth2_client
directory sotto la radice del documento in primo luogo. Idealmente, questi file si troveranno nell'estremità di terze parti che vuole utilizzare API nella nostra applicazione Laravel.Creiamo il
oauth2_client / auth_redirection.php
file con il seguente contenuto.'1', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', 'response_type' => 'code', 'scope' => ",)); header ('Location: http: / /your-laravel-site-url/oauth/authorize?'.$query);Assicurati di cambiare il
Identificativo cliente
eredirect_uri
parametri per riflettere le proprie impostazioni, quelle utilizzate durante la creazione dell'account cliente demo.Quindi, creiamo il
oauth2_client / callback.php
file con il seguente contenuto.'authorization_code', 'client_id' => '1', 'client_secret' => 'zMm0tQ9Cp7LbjK3QTgPy1pssoT1X0u7sg0YWUW01', 'redirect_uri' => 'http: //localhost/oauth2_client/callback.php', 'code' => $ _REQUEST [' codice'] ); curl_setopt ($ ch, CURLOPT_URL, $ url); curl_setopt ($ ch, CURLOPT_RETURNTRANSFER, 1); $ params_string = "; if (is_array ($ params) && count ($ params)) foreach ($ params come $ chiave => $ valore) $ params_string. = $ chiave. '='. $ valore. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, conteggio ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ($ ch); $ response = json_decode ($ result); // controlla se la risposta include access_token se (isset ($ response-> access_token) && $ response-> access_token) // si desidera memorizzare access_token nella sessione tuttavia ... $ access_token = $ response-> access_token; // usa il token sopra per effettuare ulteriori chiamate api in questa sessione o finché il token di accesso scade $ ch = curl_init (); $ url = 'http: // your-laravel-site -url / api / user / get '; $ header = array (' Autorizzazione: 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 ($ risultato); else // per qualche ragione, access_token non era disponibile // il debug va quiAnche in questo caso, assicurati di regolare gli URL e le credenziali del cliente in base alla tua configurazione nel file sopra.
Come funziona Complessivamente
In questa sezione, lo testeremo del tutto dalla prospettiva di un utente finale. Come utente finale, ci sono due applicazioni davanti a te:
- Il primo è l'applicazione Laravel con cui hai già un account. Conserva le tue informazioni che potresti condividere con altre applicazioni di terze parti.
- Il secondo è l'applicazione client demo di terze parti,
auth_redirection.php
ecallback.php
, che vuole recuperare le tue informazioni dall'applicazione Laravel usando l'API OAuth.Il flusso inizia dall'applicazione client di terze parti. Vai avanti e apri l'URL http: //localhost/oauth2_client/auth_redirection.php nel tuo browser e questo dovrebbe reindirizzare l'utente all'applicazione Laravel. Se non hai già effettuato il login nell'applicazione Laravel, l'applicazione ti chiederà di farlo in primo luogo.
Una volta che l'utente ha effettuato l'accesso, l'applicazione visualizza la pagina di autorizzazione.
Se l'utente autorizza tale richiesta, l'utente verrà reindirizzato all'applicazione client di terze parti all'indirizzo http: //localhost/oauth2_client/callback.php insieme al
codice
come ilOTTENERE
parametro che contiene il codice di autorizzazione.Una volta che l'applicazione di terze parti riceve il codice di autorizzazione, potrebbe scambiare quel codice con l'applicazione Laravel per ottenere il token di accesso. E questo è esattamente ciò che ha fatto nel seguente frammento di
oauth2_client / callback.php
file.$ ch = curl_init (); $ url = 'http: // your-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 come $ chiave => $ valore) $ params_string. = $ chiave. '='. $ valore. '&' ; rtrim ($ params_string, '&'); curl_setopt ($ ch, CURLOPT_POST, conteggio ($ params)); curl_setopt ($ ch, CURLOPT_POSTFIELDS, $ params_string); $ result = curl_exec ($ ch); curl_close ($ ch); $ response = json_decode ($ result);Successivamente, l'applicazione di terze parti controlla la risposta della richiesta CURL per vedere se contiene un token di accesso valido in primo luogo.
Non appena l'applicazione di terze parti ottiene il token di accesso, potrebbe utilizzare quel token per effettuare ulteriori chiamate API per richiedere le risorse necessarie dall'applicazione Laravel. Ovviamente, il token di accesso deve essere passato in ogni richiesta che richiede risorse dall'applicazione Laravel.
Abbiamo cercato di imitare il caso d'uso in quanto l'applicazione di terze parti vuole accedere alle informazioni dell'utente dall'applicazione Laravel. E abbiamo già creato un endpoint API, http: // your-laravel-site-url / api / user / get, nell'applicazione Laravel che lo facilita.
// controlla se la risposta include access_token se (isset ($ response-> access_token) && $ response-> access_token) // ti piacerebbe memorizzare il access_token nella sessione sebbene ... $ access_token = $ response-> access_token; // usa sopra il token per effettuare ulteriori chiamate api in questa sessione o finché il token di accesso scade $ ch = curl_init (); $ url = 'http: // your-laravel-site-url / api / user / get'; $ header = array ('Autorizzazione: 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 ($ risultato);Questo è il flusso completo di come si suppone di consumare le API OAuth2 in Laravel.
E con questo, abbiamo raggiunto la fine di questo articolo.
Conclusione
Oggi abbiamo esplorato la libreria Passport in Laravel, che ci consente di configurare facilmente un server OAuth2 in un'applicazione.
Per quelli di voi che stanno appena iniziando con Laravel o stanno cercando di espandere le vostre conoscenze, il vostro sito o la vostra applicazione con estensioni, abbiamo una varietà di cose che potete studiare nel mercato Envato.
Non esitare a condividere i tuoi pensieri e le tue domande usando il feed qui sotto!