Exista multe optiuni pentru autentificarea apelurilor API, de la certificatele client X.509 la autentificarea HTTP Basic. In ultimii ani, insa, un standard de facto a aparut sub forma de jetoane de acces OAuth 2.0 . Acestea sunt credentiale de autentificare transmise de la client la server API, si de obicei purtate ca antet HTTP.
OAuth 2.0 este insa un labirint de standarde de interconectare. Procesele de emitere, prezentare si validare a unui flux de autentificare OAuth 2.0 se bazeaza adesea pe mai multe standarde conexe. In momentul scrierii, exista opt standarde OAuth 2.0, iar token-urile de acces sunt de la caz, deoarece specificatia de baza OAuth 2.0 (RFC 6749) nu specifica un format pentru token-urile de acces. In lumea reala, exista doua formate in utilizare comuna:
- Jken Web JSON (JWT), astfel cum este definit de RFC 7519
- Jetoane opace care sunt putin mai mult decat un identificator unic pentru un client autentificat
Dupa autentificare, un client isi prezinta tokenul de acces cu fiecare cerere HTTP pentru a avea acces la resurse protejate. Validarea jetonului de acces este necesara pentru a se asigura ca a fost emis intr-adevar de un furnizor de identitate de incredere (IdP) si ca acesta nu a expirat. Deoarece IdP-urile semneaza criptografic JWT-urile pe care le emit, JWT-urile pot fi validate „offline” fara o dependenta de runtime de IdP. De obicei, un JWT include si o data de expirare, care poate fi, de asemenea, verificata. Modulul auth_jwt NGINX Plus efectueaza validarea JWT offline.
Pe de alta parte, token-urile opace trebuie validate trimitandu-le inapoi la IDP-ul care le-a emis. Cu toate acestea, acest lucru are avantajul ca astfel de jetoane pot fi revocate de catre ID, de exemplu, ca parte a unei operatiuni de deconectare globala, fara a lasa sesiunile de conectare anterioare inca active. Deconectarea globala ar putea face, de asemenea, necesara validarea JWT-urilor cu IDP.
In acest blog descriem cum NGINX si NGINX Plus pot actiona ca OAuth 2.0 Relying Party, trimitand jetoane de acces la IdP pentru validare si numai solicitari proxy care trec procesul de validare. Discutam despre diferitele beneficii ale utilizarii NGINX si NGINX Plus pentru aceasta sarcina si modul in care experienta utilizatorului poate fi imbunatatita prin memorarea in cache a raspunsurilor de validare pentru o perioada scurta de timp. Pentru NGINX Plus, vom arata si modul in care cache-ul poate fi distribuit intr-un grup de instante NGINX Plus, prin actualizarea magaziei de valori cheie cu modulul JavaScript, astfel cum este introdus in NGINX Plus R18.
Cu exceptia cazurilor in care se mentioneaza, informatiile din acest blog se aplica atat NGINX Open Source, cat si NGINX Plus. Trimiterile la NGINX Plus se aplica numai produsului respectiv.
Introspectia tokenului
Metoda standard pentru validarea token-urilor de acces cu un IdP se numeste introspectie token . RFC 7662, OAuth 2.0 Token Introspection , este acum un standard acceptat pe scara larga care descrie o interfata JSON / REST pe care o parte Relying o foloseste pentru a prezenta un jeton la IdP si descrie structura raspunsului. Este sustinut de multi dintre principalii furnizori IdP si furnizori de cloud.
Indiferent de formatul de jeton folosit, validarea la fiecare serviciu de backend sau aplicatie are ca rezultat o multime de coduri duplicate si o prelucrare inutila. Trebuie sa fie luate in considerare diverse conditii de eroare si cazuri de margine, iar acest lucru in fiecare serviciu de backend este o reteta de inconsistenta in implementare si, prin urmare, o experienta de utilizare imprevizibila. Luati in considerare modul in care fiecare serviciu de backend poate trata urmatoarele conditii de eroare:
- Fisa de acces lipsa
- Jeton de acces extrem de mare
- Caractere nevalide sau neasteptate in simbolul de acces
- Prezentate jetoane de acces multiple
- Ceasul se orienteaza prin servicii de backend
Aplicatii backend care efectueaza validare token
Utilizarea modulului NGINX auth_request pentru validarea jetoanelor
Pentru a evita duplicarea codului si problemele rezultate, putem utiliza NGINX pentru a valida token-urile de acces in numele serviciilor backend. Aceasta are o serie de avantaje:
- Cererile ajung la serviciile de backend numai atunci cand clientul a prezentat un jeton valabil
- Serviciile de backend existente pot fi protejate cu jetoane de acces, fara a necesita modificari de cod
- Doar instanta NGINX (nu fiecare aplicatie) trebuie inregistrata la IDP
- Comportamentul este consecvent pentru fiecare stare de eroare, inclusiv pentru jetoane lipsa sau nevalide
NGINX efectueaza validarea tokenului ca proxy invers
Cu NGINX care actioneaza ca un proxy invers pentru una sau mai multe aplicatii, putem utiliza modulul auth_request pentru a declansa un apel API catre un IdP inainte de a trimite o solicitare catre backend. Dupa cum vom vedea intr-un moment, urmatoarea solutie are un defect fundamental, dar introduce operatia de baza a modulului auth_request, pe care il vom extinde in sectiunile ulterioare.
Directiva auth_request (linia 5) specifica locatia pentru gestionarea apelurilor API. Proxarea backend-ului (linia 6) se intampla numai daca raspunsul auth_request are succes. Locatia auth_request este definita pe linia 9. Este marcata ca interna pentru a impiedica accesul direct al clientilor externi.
Liniile 11–14 definesc diverse atribute ale solicitarii, astfel incat aceasta sa se conformeze formatului de cerere de introspectie a jetonului. Retineti ca tokenul de acces trimis in cererea de introspectie este o componenta a corpului definita la linia 14. Aici token = $ http_apikey indica faptul ca clientul trebuie sa furnizeze tokenul de acces in antetul cererii apikey. Desigur, tokenul de acces poate fi furnizat in orice atribut al solicitarii, caz in care folosim o variabila NGINX diferita.
Extinderea auth_request cu modulul JavaScript
Dupa cum am mentionat, utilizarea modulului auth_request nu este o solutie completa. Modulul auth_request utilizeaza coduri de stare HTTP pentru a determina succesul (2 xx = bun, 4 xx = rau). Cu toate acestea, raspunsurile de introspectie cu simboluri OAuth 2.0 codifica succesul sau esecul intr-un obiect JSON si returneaza codul de stare HTTP 200 (OK) in ambele cazuri.
Formatul JSON de raspuns la introspectia tokenului pentru un jeton valid
Ceea ce avem nevoie este un analizor JSON pentru a converti raspunsul de introspectie al IDP la codul de stare HTTP corespunzator, astfel incat modulul auth_request sa poata interpreta corect raspunsul.
Din fericire, analizarea JSON este o sarcina banala pentru modulul JavaScript NGINX (njs). Deci, in loc de a defini un bloc de locatie pentru a efectua cererea de introspectie a jetonului, spunem modulului auth_request sa apeleze o functie JavaScript.
Nota: Aceasta solutie necesita incarcarea modulului JavaScript ca un modul dinamic, cu directiva load_module din nginx.conf. Pentru instructiuni, consultati NGINX Plus Ghidul de administrare.
Directiva js_content de la linia 13 specifica o functie JavaScript, introspectAccessToken, ca manipulator auth_request. Functia handler este definita in oauth2.js:
Observati ca functia introspectAccessToken face o subinchidere HTTP (linia 2) intr-o alta locatie (/ oauth2_send_request) care este definita in fragmentul de configurare de mai jos. Codul JavaScript analizeaza apoi raspunsul (linia 5) si trimite codul de stare corespunzator inapoi la modulul auth_request pe baza valorii campului activ. Tokenele valide (active) returneaza HTTP 204 (Fara continut) (dar succes) si tokenurile nevalide returneaza HTTP 403 (Interzis). Conditiile de eroare returneaza HTTP 401 (Neautorizate), astfel incat erorile pot fi diferentiate de token-urile nevalide.
Nota: Acest cod este furnizat doar ca dovada a conceptului si nu reprezinta calitatea productiei. O solutie completa cu gestionarea completa a erorilor si inregistrarea este oferita mai jos.
Locatia tinta a subrequestului definita in linia 2 seamana foarte mult cu configuratia noastra originala auth_request.
Toata configuratia pentru a construi cererea de introspectie token este cuprinsa in locatia / _oauth2_send_request. Autentificarea (linia 19), simbolul de acces in sine (linia 21) si adresa URL pentru punctul final de introspectie a jetonului (linia 22) sunt de obicei singurele elemente de configurare necesare. Autentificarea este necesara pentru ca IDP sa accepte solicitari de introspectie de jeton din aceasta instanta NGINX. Specificatia OAuth 2.0 Token Introspection necesita autentificare, dar nu specifica metoda. In acest exemplu, folosim un simbol purtator in antetul Autorizatiei.
Cu aceasta configuratie in vigoare, atunci cand NGINX primeste o solicitare, o transmite catre modulul JavaScript, care face o cerere de introspectie token impotriva IdP. Raspunsul de la IDP este inspectat si autentificarea este considerata de succes atunci cand campul activ este adevarat. Aceasta solutie este un mod compact si eficient de efectuare a introspectiei cu simboluri OAuth 2.0 cu NGINX si poate fi adaptata cu usurinta pentru alte API-uri de autentificare.
Dar nu am terminat. Cea mai mare provocare cu introspectia de jetoane in general este aceea ca adauga latenta la fiecare cerere HTTP. Aceasta poate deveni o problema semnificativa atunci cand ID-ul in cauza este o solutie gazduita sau un furnizor de cloud. NGINX si NGINX Plus pot oferi optimizari la acest dezavantaj prin memorarea in cache a raspunsurilor de introspectie.
Optimizare 1: Caching de NGINX
Introspectia de jetoane OAuth 2.0 este furnizata de IdP la un punct final JSON / REST, astfel incat raspunsul standard este un corp JSON cu statut HTTP 200. Cand acest raspuns este chemat impotriva tokenului de acces, acesta devine foarte memorabil.
Raspuns complet de introspectie a jetonului pentru un jeton valid
NGINX poate fi configurat pentru a memora in cache o copie a raspunsului de introspectie pentru fiecare simbol de acces, astfel incat data viitoare sa fie prezentat acelasi simbol de acces, NGINX serveste raspunsul de introspectie in cache in loc sa faca un apel API catre IdP. Aceasta imbunatateste considerabil latenta generala pentru solicitarile ulterioare. Putem controla cat timp se utilizeaza raspunsurile in cache pentru a atenua riscul de a accepta un simbol de acces expirat sau revocat recent. De exemplu, daca un client API face de obicei o explozie de mai multe apeluri API intr-o perioada scurta de timp, atunci o valabilitate in cache de 10 secunde ar putea fi suficienta pentru a oferi o imbunatatire masurabila a experientei utilizatorului.
Cache-ul este activat prin specificarea stocarii sale – un director de pe disc pentru cache (raspunsuri de introspectie) si o zona de memorie partajata pentru tastele (tokens de acces).
Directiva proxy_cache_path aloca stocarea necesara: / var / cache / nginx / oauth pentru raspunsurile de introspectie si o zona de memorie numita token_responses pentru taste. Este configurat in contextul http si apare astfel in afara blocurilor de server si locatie. Caching-ul in sine este apoi activat in interiorul blocului de locatie unde sunt procesate raspunsurile de introspectie ale tokenului:
Caching-ul este activat pentru aceasta locatie cu directiva proxy_cache (linia 26). In mod implicit, cache-urile NGINX bazate pe URI, dar in cazul nostru dorim sa memoram in cache raspunsul bazat pe simbolul de acces prezentat in antetul cererii apikey (linia 27).
Pe linia 28, folosim directiva proxy_cache_lock pentru a-i spune NGINX ca, daca cererile concurente sosesc cu aceeasi cheie de cache, trebuie sa astepte pana cand prima solicitare a completat memoria cache inainte de a raspunde celorlalti. Directiva proxy_cache_valid (linia 29) ii comunica NGINX cat timp pentru a memora in cache raspunsul de introspectie. Fara aceasta directiva, NGINX determina timpul de memorie in cache din anteturile de memorie cache trimise de IDP; cu toate acestea, acestea nu sunt intotdeauna de incredere, motiv pentru care, de asemenea, ii spunem NGINX sa ignore anteturile care ar afecta altfel modul in care amintim raspunsurile in cache (linia 30).
Cu activarea in cache acum, un client care prezinta un token de acces sufera doar costul de latenta al efectuarii cererii de introspectie a tokenului o data la 10 secunde.
Optimizare 2: Caching distribuit cu NGINX Plus
Combinarea memoriei in cache a continutului cu introspectia simbolica este o modalitate extrem de eficienta de a imbunatati performanta generala a aplicatiei cu un impact neglijabil asupra securitatii. Cu toate acestea, daca NGINX este implementat intr-un mod distribuit – de exemplu, in mai multe centre de date, platforme cloud sau un cluster activ – atunci raspunsurile de introspectie ale tokenului din cache sunt disponibile numai pentru instanta NGINX care a efectuat cererea de introspectie.
Cu NGINX Plus putem folosi modulul keyval – un depozit de valori de cheie in memorie – pentru a memora in cache raspunsurile de introspectie cu jeton. Mai mult, putem sincroniza, de asemenea, acele raspunsuri intr-un grup de instante NGINX Plus folosind modulul zone_sync.
hazi porno http://www.psasoft.us/__media__/js/netsoltrademark.php?d=adult66.net/
sex si porno http://bigcoveyexpl.com/__media__/js/netsoltrademark.php?d=adult66.net/
porno masaj hd http://entry-doors2go.com/__media__/js/netsoltrademark.php?d=adult66.net/
filme porno subtitrate http://rezidanslar.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/amatori
porno romanesti budoar http://thebeachdweller.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/anal
filme porno cu celebritati http://ggpopcorn.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/asiatice
porno sandra romain http://emergencyroomwait.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/beeg
porno cu milf http://gigolomovies.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/blonde
minore porno http://fantasticfansforless.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brazzers
apa lanya porno http://statecomplaint.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/brunete
porno cartoon incest http://matthewwolf.com/__media__/js/netsoltrademark.php?d=adult66.net/filme-porno/chaturbate
filme porno cu eva notty http://katewhitney.com/__media__/js/netsoltrademark.php?d=adult66.net/blonda-amatoare-de-senzatii-tari-suge-pula-si-apoi-este-fututa-in-cur-pe-canapea
filme porno mature hd http://portagebasspro.com/__media__/js/netsoltrademark.php?d=adult66.net/minora-buna-fututa-grav-de-prietenul-ei-in-fotoliu-in-diverse-pozitii-de-sex
son porno http://supersizeyoursavior.com/__media__/js/netsoltrademark.php?d=adult66.net/minora-pacalita-de-unchiul-ei-sa-stea-s-o-futa-apoi-ii-baga-pula-in-gura
türk porno izle http://theplubellfirm.com/__media__/js/netsoltrademark.php?d=adult66.net/partida-de-sex-rapida-pe-la-spate-cu-un-cuplu-de-amatori
frilme porno http://entegrisrecycle.com/__media__/js/netsoltrademark.php?d=adult66.net/matura-rapita-de-doi-tineri-si-fortata-sa-se-futa-cu-amandoi-odata
porno blonde 4k http://lorileineke.com/__media__/js/netsoltrademark.php?d=adult66.net/negresa-cu-fundul-mare-isi-ia-o-pula-in-cur-de-la-un-alb
porno cu maturi http://beijingfamilyoffice.com/__media__/js/netsoltrademark.php?d=adult66.net/pustoaica-fututa-brutal-in-baie-de-tatal-vitreg-cand-raman-singuri-acasa
film porno mature http://burlapistan.net/__media__/js/netsoltrademark.php?d=adult66.net/gagica-fututa-in-diverse-pozitii-de-unu-desene-animate-porno
filme porno vecine http://parisfamilyoffice.com/__media__/js/netsoltrademark.php?d=adult66.net/isi-fute-nevasta-in-pozitii-porno-apoi-ejaculeaza-in-ea
Aceasta inseamna ca indiferent de instanta NGINX Plus a efectuat cererea de introspectie a jetonului, raspunsul este disponibil la toate instantele NGINX Plus din cluster.
Nota: Configurarea modulului zone_sync pentru partajarea starii de rulare este in afara domeniului de aplicare al acestui blog. Pentru informatii suplimentare despre starea de partajare intr-un cluster NGINX Plus, consultati NGINX Plus Ghid de administrare.
In NGINX Plus R18 si versiunile ulterioare, stocul de valori cheie poate fi actualizat modificand variabila declarata in directiva keyval. Intrucat modulul JavaScript are acces la toate variabilele NGINX, aceasta permite ca raspunsurile la introspectie sa fie populate in depozitul de valori cheie in timpul procesarii raspunsului.
Ca si memoria cache a sistemului de fisiere NGINX, stocul de valori cheie este activat prin specificarea stocarii acesteia, in acest caz o zona de memorie care stocheaza cheia (acces token) si valoarea (raspuns de introspectie).
Retineti ca, cu parametrul timeout la directiva keyval_zone, specificam aceeasi perioada de valabilitate de 10 secunde pentru raspunsurile in cache ca la linia 29 din auth_request_cache.conf, astfel incat fiecare membru al clusterului NGINX Plus elimina independent raspunsul cand expira. Linia 2 specifica perechea cheie-valoare pentru fiecare intrare: cheia este simbolul de acces furnizat in antetul cererii apikey, iar valoarea fiind raspunsul de introspectie, astfel cum este evaluat de variabila $ token_data.
Acum, pentru fiecare cerere care include un antet de solicitare apikey, variabila $ token_data este completata cu raspunsul anterior de introspectie a jetonului, daca este cazul. Prin urmare, actualizam codul JavaScript pentru a verifica daca avem deja un raspuns de introspectie cu jeton.
Linia 2 testeaza daca exista deja o intrare de stocare a valorii cheie pentru acest simbol de acces. Deoarece exista doua cai prin care poate fi obtinut un raspuns de introspectie (din magazia de valori cheie sau dintr-un raspuns de introspectie), mutam logica de validare in urmatoarea functie separata, tokenResult:
Acum, fiecare raspuns de introspectie cu simboluri este salvat in stocul de valori cheie si sincronizat in toate celelalte membre ale clusterului NGINX Plus. Urmatorul exemplu arata o cerere HTTP simpla cu un jeton de acces valid, urmata de o interogare catre NGINX Plus API pentru a afisa continutul depozitului de valori cheie.
$ curl -IH “apikey: tQ7AfuEFvI1yI-XNPNhjT38vg_reGkpDFA” http: // localhost / HTTP / 1.1 200 OK Data: Miercuri, 24 Apr 2019 17:41:34 GMT Continut-tip: aplicatie / json Continut-Lungime: 612 $ curl http : // localhost / api / 4 / http / keyvals / access_tokens {“tQ7AfuEFvI1yI-XNPNhjT38vg_reGkpDFA”: “{\” activ \ “: true}”}
Retineti ca depozitul de valori cheie foloseste in sine formatul JSON, astfel incat raspunsul de introspectie a jetonului este automat scapat de ghilimele.
Optimizarea 3: Extragerea atributelor din raspunsul la introspectie
O capacitate utila de introspectie a jetonului OAuth 2.0 este ca raspunsul poate contine informatii despre jeton, in plus fata de starea activa. Aceste informatii includ data de expirare a jetonului si atributele utilizatorului asociat: nume de utilizator, adresa de email si asa mai departe.
Raspunsul de introspectie a tokenului cu atribute token
Aceste informatii suplimentare pot fi foarte utile. Poate fi inregistrat, utilizat pentru a implementa politici de control al accesului cu granulatie fina sau furnizat pentru aplicatii de backend. Putem exporta fiecare dintre aceste atribute in modulul auth_request, trimitandu-le ca antete de raspuns suplimentare cu un raspuns de succes (HTTP 204).
Se itereaza peste fiecare atribut al raspunsului de introspectie (linia 23) si il trimitem inapoi la modulul auth_request ca antet de raspuns. Fiecare nume de antet este prefixat cu Token- pentru a evita conflictele cu anteturile de raspuns standard (linia 26). Aceste antete de raspuns pot fi acum transformate in variabile NGINX si utilizate ca parte a configuratiei obisnuite.
In acest exemplu, convertim atributul de utilizator intr-o noua variabila, $ username (linia 11). Directiva auth_request_set ne permite sa exportam contextul raspunsului de introspectie cu jeton in contextul cererii curente. Antetul de raspuns pentru fiecare atribut (adaugat prin codul JavaScript) este disponibil ca atributul $ send_http_token_ . Linia 12 include apoi valoarea pentru $ username ca antet de solicitare care este proxied in backend. Putem repeta aceasta configuratie pentru oricare dintre atributele returnate in raspunsul de introspectie token.
Exportarea atributelor din raspunsul de introspectie token la solicitarea proxied
Configurarea productiei
Exemplele de cod si configuratie de mai sus sunt functionale si potrivite pentru testarea conceptului sau personalizarea pentru un caz de utilizare specific. Pentru utilizare in productie, va recomandam cu incredere manipularea suplimentara a erorilor, logarea si configurarea flexibila. Puteti gasi o implementare mai robusta si verboasa pentru NGINX si NGINX Plus la repo-ul nostru GitHub:
- Introspectia Token OAuth 2.0 cu NGINX (memorie in cache)
- Introspectia Token OAuth 2.0 cu NGINX Plus (memorie in cache cu valoare cheie)
rezumat
In acest blog am aratat cum sa utilizam modulul NGINX auth_request in combinatie cu modulul JavaScript pentru a efectua introspectia de jetoane OAuth 2.0 la cererile clientului. In plus, am extins acea solutie cu memorie in cache si am extras atribute din raspunsul de introspectie pentru utilizare in configuratia NGINX.
De asemenea, am descris modul in care depozitul de valori cheie NGINX Plus poate fi utilizat ca o memorie cache distribuita pentru raspunsurile la introspectie, adecvate pentru implementarile de productie intr-un grup de instante NGINX Plus.
Incercati introspectia cu jetoane OAuth 2.0 cu NGINX Plus pentru dvs. insiva – incepeti astazi procesul de 30 de zile gratuit sau contactati-ne pentru a discuta cazurile dvs. de utilizare.








