Autentificarea și autorizarea utilizând Auth0 în PHP

În acest articol, vom explora serviciul Auth0, care oferă autentificarea și autorizarea ca serviciu. Auth0 vă permite să setați funcții de bază de autentificare și de autorizare pentru aplicațiile dvs. cu clipi.

Ce este Auth0?

Auth0 este o autentificare ca instrument de serviciu care face ca implementarea funcțiilor legate de autentificare pe site-ul dvs. să fie o briză. Dacă ați construit o aplicație și doriți doar să externalizați funcțiile de autentificare și de autorizare, un serviciu precum Auth0 este ceva ce ar trebui să aveți în vedere.

Permiteți-mi să rezumez rapid ceea ce Auth0 are de oferit:

  • o singură logare
  • autentificare multifactorială
  • fără autentificare fără parole
  • managementul utilizatorilor
  • și mult mai mult

În acest articol, vom trece prin câteva metode de conectare unică pe care le-ați putea implementa în aplicațiile dvs. web pentru a utiliza funcțiile de autentificare oferite de serviciul Auth0.

În prima jumătate a articolului, vom explora modul de configurare a funcționalității de autentificare de bază într-o aplicație web PHP de pe server. În a doua jumătate, vă voi explica cum ați putea securiza API-urile personalizate prin configurarea autorizației OAuth utilizând serviciul Auth0.

Integrarea autentificării pe server

În această secțiune, vom trece prin modul în care puteți configura rapid autentificarea de bază pentru aplicațiile web de pe server folosind Auth0. De fapt, echipa Auth0 oferă deja o mostră GitHub la îndemână, care demonstrează exemplele de bază, așa că vom folosi asta în loc să reinventăm roata.

Înainte de a vă deplasa înainte, asigurați-vă că ați instalat Compozitor ca pe cel care va fi folosit pentru a instala kiturile SDK Auth0 reale folosind composer.json fişier. De asemenea, dacă doriți să urmați împreună cu exemplele din acest articol, continuați și obțineți un cont gratuit la Auth0.

Configurați Proiectul

Să mergem mai departe și să luăm clona proiectului de eșantioane.

git clone https://github.com/auth0-samples/auth0-php-web-app.git .

Mergeți înainte de a alerga compozitorul instala comanda pentru a instala dependențele.

cd 00-Instalați compozitorul pentru începători-semințe

In conformitate cu composer.json fișier, ar fi trebuit instalat vlucas / phpdotenv și auth0 / auth0-php pachete.

"nume": "auth0 / basic-webapp-sample", "descriere": " auth0-php ":" ~ 5.0 "," licență ":" MIT "," autori ": " name ":" Martin Gontovnikas " ":" Germán Lena "," e-mail ":" [email protected] "]

vlucas / phpdotenv biblioteca este folosită pentru a inițializa variabilele de mediu din .env fişier. Astfel, vă permite să separați configurația de codul care se schimbă între medii.

Pe de altă parte, auth0 / auth0-php pachet este cel care ne va ajuta să înființăm autorizația în aplicația noastră.

Apoi, configurați configurația pentru aplicația noastră în .env fişier. Continuați și creați .env fișier prin copierea ei de la .env.example fişier.

cp .env.exemplu.env

Conține valori de configurare care vor fi utilizate de biblioteca Auth0.

AUTH0_CLIENT_ID = CLIENT_ID AUTH0_DOMAIN = DOMAIN_NAME AUTH0_CLIENT_SECRET = CLIENT_SECRET AUTH0_CALLBACK_URL = CALLBACK_URL AUTH0_AUDIENCE =

Ar trebui să puteți găsi majoritatea setărilor în secțiunea Aplicații> App implicit> Setări pe tabloul de bord Auth0. Rețineți că folosesc aplicația implicită creată de sistem. Desigur, ați putea să faceți o nouă cerere dacă doriți să faceți acest lucru.

AUTH0_CALLBACK_URL este adresa URL a aplicației dvs. în cazul în care Auth0 va redirecționa utilizatorii după autentificare și deconectare. Valoarea setată în acest câmp trebuie să fie configurată sub Adrese URL acceptate de inversare sub setările aplicației din tabloul de bord Auth0.

Veți găsi trei fișiere principale care implementează cea mai mare parte a logicii de autentificare.

  • index.php: Aceasta este pagina principală care afișează fie un buton de conectare sau un buton de logout bazat pe starea utilizatorului.
  • login.php: Acest script va fi inițiat când faceți clic pe butonul de conectare și acesta va redirecționa utilizatorii la interfața de autentificare Auth0 pentru autentificare. După autentificare, vor fi redirecționați înapoi la AUTH0_CALLBACK_URL.
  • logout.php: Acest script va fi inițiat când faceți clic pe butonul de deconectare și va redirecționa utilizatorii la Auth0 în fundal, le va deconecta și le va reveni la AUTH0_CALLBACK_URL.

Fișiere cheie de proiect

Să trecem rapid prin fiecare fișier din proiectul de pornire.

Scriptul de conectare

Vom începe cu login.php fişier.

 Domeniul $, client_id '=> $ client_id,' client_secret '=> $ client_secret,' redirect_uri '=> $ redirect_uri,' audience '=> $ audience,' scope` => 'openid profile', 'persist_id_token' adevărat, 'persist_access_token' => true, 'persist_refresh_token' => true,]); $ Auth0-> conectare (); 

La început, am inclus autoloadere care sunt responsabile pentru încărcarea claselor Auth0 și a celor legate de variabile de mediu. În continuare, inițializăm variabilele de configurare de la .env fișier folosind getenv funcţie.

Apoi, instanțiăm obiectul Auth0 și sunăm metoda de conectare care redirecționează utilizatorii la Auth0 pentru autentificare. După conectare, utilizatorii vor fi redirecționați înapoi la site-ul nostru.

Vă puteți conecta utilizând conturile sociale precum Facebook, Google și altele asemenea sau puteți crea un cont nou în timpul conectării. În ambele cazuri, Auth0 va crea înregistrări pentru noii utilizatori la sfârșitul lor. Puteți activa diferite conectări sociale Conexiuni> Social pe tabloul de bord Auth0. De asemenea, puteți verifica lista utilizatorilor care sunt conectați utilizând Auth0 din tabloul de bord Auth0 sub Utilizatori legătură.

Scriptul de deconectare

Apoi, să aruncăm o privire rapidă la logout.php fişier.

 Domeniul $, client_id '=> $ client_id,' client_secret '=> $ client_secret,' redirect_uri '=> $ redirect_uri,' audience '=> $ audience,' scope` => 'openid profile', 'persist_id_token' adevărat, 'persist_refresh_token' => true,]); $ Auth0-> logout (); $ return_to = 'http: //'. $ _SERVER [ 'HTTP_HOST']; $ logout_url = sprintf ('http: //% s / v2 / logout? client_id =% s & returnTo =% s', $ domeniu, $ client_id, $ return_to); header ('Locație:'. $ logout_url); a muri();

Acest lucru funcționează aproape la fel ca login.php fișier, cu excepția faptului că acesta va fi sunat când utilizatorii se deconectează. logout se solicită să expire o sesiune de utilizator în aplicația dvs. După aceea, utilizatorul va fi redirecționat către Auth0, astfel încât serviciul să fie informat despre activitatea de deconectare a utilizatorului. În cele din urmă, utilizatorul va fi redirecționat înapoi la aplicația dvs..

Fișierul index

În cele din urmă, hai să trecem prin index.php fișier, care este punctul de intrare al aplicației noastre.

 Domeniul $, client_id '=> $ client_id,' client_secret '=> $ client_secret,' redirect_uri '=> $ redirect_uri,' audience '=> $ audience,' scope` => 'openid profile', 'persist_id_token' adevărat, 'persist_access_token' => true, 'persist_refresh_token' => true,]); $ userInfo = $ auth0-> getUser (); ?>           

Exemplul Auth0

Infrastructura de identitate cu zero fricțiuni, construită pentru dezvoltatori

Conectare

OAuth 2.0 - Bine, Rău și Ugly

Într-o lume dominată de social media, este greu să nu intri într-o aplicație client pe care ați folosit-o pentru a accesa resurse restricționate pe alte ...
Agraj Mangal
Dezvoltare web
  • Cum să autentificați utilizatorii cu Twitter OAuth 2.0

    În acest tutorial, veți învăța cum să utilizați Twitter API 1.1 și OAuth 2.0 pentru a autentifica utilizatorii aplicației dvs. și pentru a publica un tweet de testare.
    Anton Bagaiev
    PHP
  • În schimb, vom intra imediat în implementarea reală. Mergeți și creați un auth_code_grant_example.php fișier cu următorul conținut.

     '' ',' '' '' ',' CALLBACK_URL "); $ _SESSION [ 'oauth2state'] = $ params [ 'stare']; $ str_params = "; foreach ($ paramuri ca $ cheie => valoare $) $ str_params. = $ key." = ". urlencode ($ value)" & ";?>">   'code_code', 'client_id' => 'CLIENT_ID', 'client_secret' => 'CLIENT_SECRET', 'code' => $ _GET ['code'], 'redirect_uri' => 'CALLBACK_URL ; "$ curl_setopt_array ($ curl_setopt_array ($ curl_setopt_array ($ curl_setopt_array ($ curl_setopt_array ($ curl_setopt_array ($ curl_setopt_array ($ curl_setopt_array) $ str_params ="; curl, array (CURLOPT_URL => "https: // AUTH0_DOMAIN / oauth / token", CURLOPT_RETURNTRANSFER => adevărat, CURLOPT_CUSTOMREQUEST => POST, CURLOPT_POSTFIELDS => $ str_params)) $ curl_response = curl_exec ($ curl); $ curl_error ($ curl); if ($ curl_error) echo "Eroare în răspunsul CURL:" $ curl_error; else $ $ arr_json_data = json_decode ($ curl_response) $ curl_setopt_array ($ curl, array (CURLOPT_URL => "http: // YOUR_API_DOMAIN /demo_api_server.php", CURLOPT_RETURNTRANSFER = arr_json_data-> access_token)) $ access_token = $ arr_json_data-> access_token; > true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array ("Autorizare: purtător $ access_token")))) $ curl_response = curl_exec (curl_error curl_error curl_close curl_close ); dacă ($ curl_error) echo "Eroare în CURL răspuns de la DEMO API: ". $ Curl_error;  altceva echo "Răspuns Demo API:". $ Curl_response;  altceva echo 'Răspuns nevalid, nu a fost găsit un jeton de acces.'; 

    Să aruncăm o privire la modul în care funcționează acest cod!

    Începutul fluxului de autorizare

    Mai întâi, am pregătit o legătură care trimite utilizatorul la serverul Auth0 pentru a începe fluxul de autorizare.

    // verificați dacă trebuie să afișați linkul "Sign In" $ params = array ('audience' => 'AUDIENCE', 'scope' => 'profile', 'response_type' => '=>' CLIENT_ID ',' state '=>' SOME_RANDOM_STRING ',' redirect_uri '=>' CALLBACK_URL '); $ _SESSION [ 'oauth2state'] = $ params [ 'stare']; $ str_params = "; foreach ($ paramuri ca $ cheie => valoare $) $ str_params. = $ key." = ". urlencode ($ value)" & ";?>"> 

    Înlocuiți-vă PUBLIC, CLIENT_ID, și CALLBACK_URL cu valori corespunzătoare aplicației dvs. PUBLIC parametrul ar trebui înlocuit cu valoarea lui Identificator câmp găsit sub API-uri> API API> Setări pe tabloul de bord Auth0.

    SOME_RANDOM_STRING ar trebui să fie înlocuită cu o valoare unică care este greu de ghicit. Acest șir este utilizat pentru a preveni atacurile CSRF. De asemenea, asigurați-vă că ați înlocuit-o AUTH0_DOMAIN cu numele dvs. de domeniu, așa cum am discutat mai devreme.

    Obținerea tokenului de acces

    Când un utilizator face clic pe Conectare link, acestea vor fi duși la serverul Auth0 pentru autentificare. După autentificare, vor fi rugați să autorizeze accesul aplicației la profilul dvs. Autorizația postală, utilizatorul va fi redirecționat înapoi la cererea dvs. cu cod ca $ _GET parametru.

    În continuare, putem schimba acest lucru cod pentru a obține indicativul de acces.

    // Dacă codul auth este prezent în $ _GET //, să îl schimbăm pentru tokenul de acces $ params = array ('grant_type' => 'authorization_code', 'client_id' => 'CLIENT_ID', 'client_secret '=>' CLIENT_SECRET ',' code '=> $ _GET [' code '],' redirect_uri '=>' CALLBACK_URL '); $ str_params = "; foreach ($ paramuri ca $ cheie => valoare $) $ str_params. = $ cheie." "$ urlcode ($ value)" $ curl_response = curl_setopt_array ($ curl, array (CURLOPT_URL => "https: // AUTH0_DOMAIN / oauth / token", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_POSTFIELDS => $ str_params));

    După cum puteți vedea, este nevoie de un singur apel CURL pentru a prelua simbolul de acces. 

    Apelați punctul final API personalizat

    Odată ce ați atins indicativul de acces, puteți apela punctul final al API personalizat prin includerea acestuia în antet.

    $ acces_token = $ arr_json_data-> acces_token; $ curl = curl_init (); curl_setopt_array ($ curl, array (CURLOPT_URL => "http: // YOUR_API_DOMAIN /demo_api_server.php", CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "GET", CURLOPT_HTTPHEADER => array ))); $ curl_response = curl_exec ($ curl); $ curl_error = curl_error ($ curl); curl_close ($ curl); dacă ($ curl_error) echo "Eroare în răspunsul CURL de la DEMO API:". $ Curl_error;  altceva echo "Răspuns Demo API:". $ Curl_response; 

    Un punct final de autentificare API Auth0

    Fișierul cu resurse fictive API demo_api_server.php ar putea arata cam asa:

     'HASHING_ALGORITHM'], 'valid_audiences' => ['AUDIENCE'], 'authorized_iss' => ['DOMAIN']]; $ acces_token = getBearerToken (); $ token_info = $ verificator-> verifyAndDecode ($ access_token); echo json_encode (array ('date' => 'Date despre resurse API !!'));  captură (\ Auth0 \ SDK \ Exception \ CoreException $ e) aruncați $ e; echo json_encode (array ('eroare' => $ e-> getMessage ()));  funcția getAuthorizationHeader () $ headers = null; dacă isset ($ _ SERVER ['Autorizare'])) $ headers = trim ($ _ SERVER ["Autorizare"]);  altceva dacă (isset ($ _ SERVER ['HTTP_AUTHORIZATION'])) // Nginx sau rapid CGI $ headers = trim ($ _ SERVER ["HTTP_AUTHORIZATION"]);  elseif (funcția_există ('apache_request_headers')) $ requestHeaders = apache_request_headers (); // bug-ul serverului pentru bug-uri în versiunile anterioare Android (un efect secundar frumos al acestei soluții înseamnă că nu ne pasă de capitalizare pentru autorizare) $ requestHeaders = array_combine (array_map ('ucwords', array_keys ($ requestHeaders) array_values ​​($ requestHeaders)); // print_r ($ requestHeaders); dacă (isset ($ requestHeaders ['Autorizare'])) $ headers = trim ($ requestHeaders ['Autorizare']);  returnează $ anteturi;  funcția getBearerToken () $ headers = getAuthorizationHeader (); // HEADER: Obțineți tokenul de acces din antet dacă (! Empty ($ headers)) if (preg_match ('/ Bearer \ s (\ S +) /', $ headers, matches matches) ];  întoarce null; 

    Să trecem repede la părțile importante ale acestui cod.

    Validarea tokenului de acces

    Este responsabilitatea dvs. să validați jetonul de acces primit înainte de a acorda acces la resursa protejată. Și exact așa am făcut în următorul fragment. Am folosit-o JWTVerifier clasa de utilități pentru a valida simbolul de acces.

    încercați $ verifier = noul JWTVerifier (['support_algs '=> [' SIGNING_ALGORITHM '],' valid_audiences '=> [' AUDIENCE '],' authorized_iss '=> [' DOMAIN ']]; $ acces_token = getBearerToken (); $ token_info = $ verificator-> verifyAndDecode ($ access_token); echo json_encode (array ('date' => 'Date despre resurse API !!'));  captură (\ Auth0 \ SDK \ Exception \ CoreException $ e) aruncați $ e; echo json_encode (array ('eroare' => $ e-> getMessage ())); 

    SIGNING_ALGORITHM ar trebui înlocuit cu valoarea Semnarea algoritmului câmp găsit sub API-uri> API API> Setări.

    Prin urmare, puteți proteja API-urile personalizate dacă doriți să utilizați fluxul OAuth2 în serviciul Auth0.

    Concluzie

    Astăzi, am trecut prin serviciul Auth0, care oferă autentificare și autorizare ca serviciu. După introducerea serviciului Auth0, am trecut prin câteva exemple practice pentru a demonstra cum ați putea să o integrați cu aplicațiile dvs. PHP.

    Nu ezitați să postați sugestiile și interogările folosind feed-ul de mai jos!

    Cod