Si të konfiguroni telefonat inteligjentë dhe PC. Portali informativ
  • në shtëpi
  • Lajme
  • OAuth: përshkrim i protokollit në gjuhë të thjeshtë dhe të kuptueshme.

OAuth: përshkrim i protokollit në gjuhë të thjeshtë dhe të kuptueshme.

Ka shumë mënyra për të përhapur spam me qëllim të keq në VKontakte. Por dëmtuesit nuk janë në gjumë, gjithnjë e më shumë ide interesante u vijnë në kokë. Dhe doli të ishte i dobishëm. Mashtruesit kanë mësuar ta përdorin atë për të anashkaluar faqen e paralajmërimit për faqet me qëllim të keq.

Dhe gjithçka filloi me faktin se një ditë mesazhi i mëposhtëm u shfaq në murin tim:


Për kuriozitet, ndoqa lidhjen dhe përfundova në një faqe tjetër phishing. Por vetë lidhja më dukej e çuditshme, dukej si (gjysmë karaktere në ASCII):
vkontakte.ru/away.php? te= http% 3A% 2F% 2FApi.vKontakte.Ru% 2F% 2Fo% 2561u% 2574% ...

Këtu fillon argëtimi...
Le t'i hedhim një sy lidhjes së dytë pjesë-pjesë:

Çfarë do të thotë secili prej parametrave:

  • klient_id - ID e aplikacionit që kërkon autorizim;
  • redirect_uri - adresa në të cilën do të transferohet aksesi_token (përmes një ridrejtimi);
  • shfaqja - pamja e dritares së autorizimit (faqe, popup, prekje dhe wap).
Redirect_uri aktuale përmbante adresën e sajtit të phishing. Meqenëse u bë një gabim në parametrin e ekranit (në të kishte mbeturina "? 390852", dritarja e autorizimit nuk u shfaq, por një ridrejtim në faqen e phishing me parametrat: gabim = kërkesë_invalid & error_description = E pavlefshme + shfaqje + kaloi

Kjo është e gjithë pika e anashkalimit të listës së zezë të faqeve me qëllim të keq në VKontakte. Ekziston vetëm një alarm për kalimin në api.vk.com. Dhe si rezultat i tranzicionit, ne shkojmë direkt në faqen e phishing, e cila është në listën e zezë. Kur ndiqni lidhjen vkontakte.ru/away.php?to=vgostivk.dyndns**:

Siç doli, aplikacioni që supozohej se kërkonte autorizim ishte i varur nga përdoruesi i hakuar:

Dhe vetë faqja e phishing ishte mjaft interesante. Dizajni, si zakonisht, ishte një dizajn kontakti dhe ofroi hyrjen. E kalova autorizimin përmes një poste dhe fjalëkalimi të rastësishëm, falsifikimi u gëlltit në mënyrë të përsosur. Pastaj ishte edhe më interesant, lajmet nga "Pavel Durov" u shfaqën në faqen kryesore:

Pasi klikoni në butonin "Krijo numërues personal", pasoi një shirit i mrekullueshëm përparimi. Më pas iu kërkua të tregoni numrin tuaj dhe të dërgoni sms:

Në teori, pas "aktivizimit" të suksesshëm duhet të ishte transferuar në faqen activ.php, por nuk arrita dot atje. Fragmente nga skriptet JS të faqes së phishing:

...
nëse (statusi i kërkuar == 200) (
// nëse statusi është 200 (OK) - kthejini një përgjigje përdoruesit
nëse (req.responseText == "ok") (
//statusElem.innerHTML = "Gjithçka është mirë!";
get_activation ();
}
if (req.responseText == "jo") (statusElem.innerHTML = "Kodi i pavlefshëm i aktivizimit";}
//statusElem.innerHTML = "Përgjigja e serverit:" + req.responseText;
...
funksioni get_activation () (
dokument .location = "activ.php";
}

* Ky kod burim u theksua me theksuesin e kodit burimor.


Rezultati: Mashtruesit përdorin OAuth 2.0 për të anashkaluar paralajmërimet, për të marrë fjalëkalimin dhe emailin e përdoruesit dhe madje përpiqen të mashtrojnë në dërgimin e sms (me shumë mundësi duke përdorur një sistem abonimi).

Në vitin 2010, filloi puna për një version krejtësisht të ri të protokollit OAuth 2.0 që nuk do të jetë i pajtueshëm me OAuth 1.0. Në tetor 2012, korniza OAuth 2.0 u publikua në RFC 6749 dhe përdorimi i bartësit të tokenit në RFC 6750, të dy standardet ndjekin kërkesat për komente. RFC-të shtesë janë ende në zhvillim.

Kishte disa parakushte për krijimin e OAuth 2.0. Para së gjithash, OAuth është mjaft jo i parëndësishëm për t'u përdorur në anën e klientit. Një nga qëllimet në zhvillimin e OAuth-it të ri është thjeshtimi i zhvillimit të aplikacioneve të klientëve. Së dyti, megjithë zbatimin e tre metodave (të quajtura flukse) të marrjes së një token (identifikues unik) për autorizimin e deklaruar në standard: për aplikacionet në internet, klientët desktop dhe klientët celularë, në fakt, të tre metodat bashkohen në një. Dhe së treti, protokolli doli të ishte i shkallëzuar dobët. Është planifikuar të shtohet në të:

  • 6 transmetime të reja.
Rrjedha e agjentit të përdoruesit - për klientët që funksionojnë brenda një agjenti përdoruesi (zakonisht një shfletues ueb). Rrjedha e serverit në ueb - për klientët që janë pjesë e aplikacionit në internet të serverit, të aksesueshëm nëpërmjet kërkesave HTTP. Fluksi i pajisjes - I përshtatshëm për klientët që funksionojnë në pajisje të kufizuara, por ku përdoruesi përfundimtar ka qasje të veçantë në shfletuesin në një kompjuter ose pajisje tjetër. Rrjedha e emrit të përdoruesit dhe fjalëkalimit - Përdoret kur përdoruesi i beson klientit për të trajtuar kredencialet e tij, por gjithsesi i lejon klientit në mënyrë të padëshiruar të ruajë emrin e përdoruesit dhe fjalëkalimin. Kjo rrjedhë është e përshtatshme vetëm kur ekziston një shkallë e lartë besimi midis përdoruesit dhe klientit. Rrjedha e Kredencialeve të Klientit - Klienti përdor kredencialet e tij për të marrë një shenjë. Rrjedha e Pohimit - Një klient paraqet një pohim, të tillë si një pohim SAML, në një server autorizimi në këmbim të një token. Aplikacionet që funksionojnë në një kompjuter desktop ose pajisje celulare mund të zbatohen duke përdorur temat e mësipërme.
  • Shenja mbajtëse.
Metoda e autorizimit është e ngjashme me metodën ekzistuese të autorizimit të cookie-ve. Në këtë rast, token përdoret drejtpërdrejt si sekret (vetë fakti i të pasurit një token autorizon klientin) dhe transmetohet përmes HTTPS. Kjo ju lejon të përdorni API përmes skripteve të thjeshta (për shembull duke përdorur cURL).
  • Nënshkrimi i thjeshtuar.
Nënshkrimi është thjeshtuar shumë për të eliminuar nevojën për analizë të veçantë, kodim dhe renditje të parametrave.
  • Shenjat jetëshkurtër me autorizim afatgjatë.
Në vend që të lëshojë një token jetëgjatë (i cili mund të rrezikohet për një kohë të gjatë), serveri ofron akses afatshkurtër dhe aftësi afatgjatë për të rinovuar tokenin pa ndërhyrjen e përdoruesit.
  • Ndarja e roleve.
Serverë të ndryshëm mund të jenë përgjegjës për autorizimin dhe sigurimin e aksesit në API.

Vlen të theksohet se megjithëse standardi OAuth 2.0 nuk është miratuar ende, ai tashmë është në përdorim nga disa shërbime. Për shembull, API Graph i Facebook-ut mbështet vetëm OAuth 2.0.

Dallimi midis OAuth dhe OpenID

Ekziston një ide e gabuar që OAuth është një zgjatim i protokollit OpenID. Në fakt, nuk është kështu. Ndërsa OpenID dhe OAuth kanë shumë të përbashkëta, kjo e fundit është një protokoll i veçantë që nuk ka asnjë lidhje me OpenID.

Vula kohore dhe Nonce

Për të parandaluar kërcënimin e kërkesave të ripërdorimit, OAuth përdor një vulë nonce dhe kohë. Termi "nonce" do të thotë se kjo kohë përdoret një herë dhe është një grup unik i rastësishëm shkronjash dhe numrash, i cili është krijuar për të identifikuar në mënyrë unike çdo kërkesë të nënshkruar. Duke pasur një identifikues unik për secilën kërkesë, ofruesi i shërbimit do të jetë në gjendje të pengojë kërkesat e ripërdorimit. Kjo do të thotë që klienti gjeneron një varg unik për çdo kërkesë të dërguar në server dhe serveri mban gjurmët e të gjitha nonces të përdorura për të parandaluar përdorimin e tyre për herë të dytë.

Përdorimi i nonces mund të jetë shumë i kushtueshëm për serverin pasi ato kërkojnë ruajtjen e përhershme të të gjitha nonces të marra. Për t'i mbajtur gjërat më të thjeshta, OAuth shton një vulë kohore për çdo kërkesë, e cila lejon serverin të ruajë vetëm nonce për një kohë të kufizuar. Kur një kërkesë arrin me një vulë kohore që është më e hershme se koha e ruajtur, ajo refuzohet pasi serveri nuk ka më një nonce që nga ajo kohë.

Kredencialet dhe argumentet

OAuth përdor tre lloje kredencialesh: çelësin e konsumatorit dhe kredencialet sekrete ose klienti, kredencialet e kërkesës dhe kredencialet sekrete ose të përkohshme, dhe kredencialet e hyrjes dhe kredencialet sekrete ose token.

Kredencialet e klientit përdoren për të vërtetuar klientin. Kjo i lejon serverit të mbledhë informacione rreth klientëve. Duke përdorur shërbimet e tij, serveri u ofron disa klientëve trajtime të veçanta, të tilla si rregullimi i aksesit falas, ose sigurimi i pronarit të burimit me informacion më të detajuar rreth klientëve që përpiqen të aksesojnë burimet e tyre të mbrojtura. Në disa raste, kredencialet e klientit nuk mund të besohen dhe mund të përdoren vetëm për qëllime informative, si p.sh. në aplikacionet desktop.

Shenja përdoret në vend të emrit dhe fjalëkalimit të pronarit të burimit. Pronari i burimit nuk do të ndajë kredencialet e tij me klientin, por përkundrazi do të lejojë serverin t'i lëshojë një token klientit - një klasë e veçantë kredencialesh që përfaqësojnë aksesin e grantit. Klienti përdor tokenin për të hyrë në burimin e mbrojtur pa e ditur fjalëkalimin e pronarit të burimit.

Një shenjë përbëhet nga një karakter identifikues, zakonisht (por jo gjithmonë) një grup i rastësishëm shkronjash dhe numrash, i cili është unik dhe i vështirë për t'u gjetur, dhe një çelës për të mbrojtur tokenin nga përdorimi nga persona të paautorizuar. Shenja është e kufizuar në shtrirje dhe kohëzgjatje, dhe mund të revokohet në çdo kohë nga pronari i burimit pa ndikuar në argumentet e tjera të lëshuara për klientët e tjerë.

Procesi i autorizimit OAuth përdor gjithashtu një grup kredencialesh të përkohshme që përdoren për të përcaktuar kërkesën për autorizim. Për të kënaqur lloje të ndryshme klientësh (përparësi në internet, desktop, celular, etj.), kredencialet e përkohshme ofrojnë fleksibilitet dhe siguri shtesë.

Si funksionon OAuth

Si funksionon protokolli OAuth

Le të shpjegojmë se si funksionon protokolli OAuth duke përdorur një shembull. Le të themi se përdoruesi (pronari i burimit) dëshiron të printojë fotot (burimet) e tij të ngarkuara në sitin "photos.example.net" (server) duke përdorur shërbimin e printimit "printer.example.net" (klient).

  1. Klienti nëpërmjet protokollit HTTPS dërgon një kërkesë në server, i cili përmban identifikuesin e klientit, vulën kohore, adresën e kthimit të thirrjes në të cilën duhet të kthehet token, llojin e nënshkrimit dixhital të përdorur dhe vetë nënshkrimin.
  2. Serveri e pranon kërkesën dhe i përgjigjet klientit me një Token Access dhe një pjesë të sekretit të përbashkët.
  3. Klienti transferon shenjën te pronari (përdoruesi) i burimit dhe e ridrejton atë te serveri për autorizim.
  4. Serveri, pasi ka marrë një shenjë nga përdoruesi, i kërkon atij hyrjen dhe fjalëkalimin e tij, dhe në rast të vërtetimit të suksesshëm, i kërkon përdoruesit të konfirmojë aksesin e klientit në burimet (autorizim), pas së cilës përdoruesi ridrejtohet nga serveri në klientin.
  5. Klienti dërgon një shenjë në server përmes TLS dhe kërkon qasje në burime.
  6. Serveri e pranon kërkesën dhe i përgjigjet klientit me një shenjë të re aksesi.
  7. Duke përdorur tokenin e ri, klienti kontakton serverin për burime.
  8. Serveri pranon kërkesën dhe ofron burime.

Ky shembull përshkruan një rrjedhë kodi autorizimi. Përveç kësaj, flukset e mëposhtme përshkruhen në standardin OAuth 2.0:

  • Rrjedha e nënkuptuar e grantit
Dallimi nga një transmetim me një kod konfirmimi është se klienti nuk vërtetohet në server dhe shenja e hyrjes lëshohet nga serveri pas një kërkese autorizimi.
  • Rifreskimi i një rrjedhe të skaduar të shenjave të aksesit
Dallimet midis këtij transmetimi dhe shembullit të dhënë janë si më poshtë: në hapin 2, serveri, përveç tokenit të aksesit, i cili ka një jetëgjatësi të kufizuar, lëshon një token refresh; në hapin 8, serveri kontrollon nëse token-i i aksesit është i vlefshëm (në kuptimin e skadimit) dhe, në varësi të kësaj, ose siguron akses në burime ose kërkon një përditësim të tokenit të aksesit (i cili sigurohet me prezantimin e tokenit të përditësimit).
  • Rrjedha e kredencialeve të fjalëkalimit të pronarit të burimit
Në këtë rrjedhë, pronari i burimeve i siguron klientit një emër përdoruesi dhe fjalëkalim, ai i transferon ato në server dhe merr një shenjë për të hyrë në burime. Përkundër faktit se kjo mënyrë funksionimi është disi në kundërshtim me konceptin e krijimit të një protokolli, ai përshkruhet në specifikim.
  • Rrjedha e kredencialeve të klientit
Në këtë mënyrë funksionimi të protokollit, serveri siguron një shenjë aksesi pasi klienti dërgon përdoruesin dhe fjalëkalimin e tij, i cili ishte vendosur më parë nga serveri i autorizimit (specifikimi nuk specifikon se si saktësisht). Në fakt, klienti kalon menjëherë si nga autorizimi ashtu edhe nga vërtetimi.

OAuth mbështet dy metoda për vërtetimin e mesazheve nga një klient: HMAC -SHA1 dhe RSA -SHA1. Është e mundur të dërgohen mesazhe pa nënshkrim, pastaj "tekst i thjeshtë" tregohet në fushën e llojit të nënshkrimit. Por në këtë rast, sipas specifikimit, lidhja midis klientit dhe serverit duhet të vendoset përmes SSL ose TLS.

Portalet që përdorin OAuth

Diskutim

Në korrik 2012, Eran Hammer, redaktori aktual i standardit OAuth 2.0, njoftoi tërheqjen e tij pas tre vitesh punë në standardin e ri dhe kërkoi që emri i tij të hiqej nga specifikimet. Ai foli për pikëpamjet e tij në faqen e tij të internetit. Më vonë ai mbajti një fjalim. ...

Shënime (redakto)

Shiko gjithashtu

Lidhjet


Fondacioni Wikimedia. 2010.


  1. Hapja e shfletuesit të integruar me një faqe identifikimi
  2. Përdoruesit i kërkohet të konfirmojë lëshimin e të drejtave
  3. Nëse përdoruesi pajtohet, shfletuesi do të ridrejtohet në faqen cung në fragment (pas #) URL-ja e të cilit shtohet shenjë e hyrjes
  4. Aplikacioni kap ridrejtimin dhe merr shenjë e hyrjes nga adresa e faqes
Ky opsion kërkon ngritjen e dritares së shfletuesit në aplikacion, por nuk kërkon anën e serverit dhe një thirrje shtesë server-server për shkëmbim Kodi i autorizimitshenjë e hyrjes.
Shembull
Hapni një shfletues me një faqe autorizimi:
> GET / oauth / autorizoj? Response_type = token & client_id = 464119 HTTP / 1.1> Host: connect.mail.ru

Pasi përdoruesi i jep të drejtat, ndodh një ridrejtim në faqen standarde të cungut, për Mail.Ru kjo është connect.mail.ru/oauth/success.html:
< HTTP/1.1 302 Found < Location: http://connect.mail.ru/oauth/success.html#access_token=FJQbwq9&token_type=bearer& expires_in=86400&refresh_token=yaeFa0gu

Aplikacioni duhet të përgjojë ridrejtimin e fundit, ta marrë atë nga adresa hyrje_token dhe ta përdorin atë për të hyrë në burimet e mbrojtura.

Autorizimi i hyrjes dhe fjalëkalimit

Autorizimi i hyrjes dhe fjalëkalimit është një kërkesë e thjeshtë POST që kthehet shenjë e hyrjes... Kjo skemë nuk është asgjë e re, por është futur në standard për përgjithësi dhe rekomandohet për përdorim vetëm kur opsionet e tjera të autorizimit nuk janë të disponueshme.
Shembull
> POST / oauth / token HTTP / 1.1> Pritësi: connect.mail.ru> Lloji i përmbajtjes: aplikacioni / x-www-form-urlencoded>> grant_ty [email i mbrojtur] corp.mail.ru & fjalëkalimi = qwerty< HTTP/1.1 200 OK < Content-Type: application/json < < { < "access_token":"SlAV32hkKG", < "token_type":"bearer", < "expires_in":86400, < "refresh_token":"8xLOxBtZp8", < }
Përshkrimi në specifikim

Rivendos autorizimin e mëparshëm

Zakonisht, shenjë e hyrjes ka një jetëgjatësi të kufizuar. Kjo mund të jetë e dobishme, për shembull, nëse transmetohet përmes kanaleve të hapura. Për të mos detyruar përdoruesin të kalojë autorizimin pas skadimit shenjë e hyrjes"a, në të gjitha opsionet e mësipërme, përveç shenjë e hyrjes"Mund të ktheheni për më shumë shenjë rifreskimi... Në të mund të merrni shenjë e hyrjes duke përdorur një kërkesë HTTP, e ngjashme me autorizimin e hyrjes dhe fjalëkalimit.
Shembull
> POST / oauth / token HTTP / 1.1> Pritësi: connect.mail.ru> Lloji i përmbajtjes: aplikacioni / x-www-form-urlencoded>> lloji_grant = refresh_token & client_id = 31337 & client_secret = deadbeef & refresh_token = Zpresh_token = 8xLOx< HTTP/1.1 200 OK < Content-Type: application/json < < { < "access_token":"Uu8oor1i", < "token_type":"bearer", < "expires_in":86400, < "refresh_token":"ohWo1ohr", < }

Një protokoll popullor që lejon sociale shërbimet integrohen me njëra-tjetrën dhe ofrojnë një mënyrë të sigurt për të shkëmbyer informacione personale. OAuth mund të lidhë 2 shërbime, secila prej të cilave ka bazën e vet të përdoruesit - në këtë rast unë i quaj "sociale". Kur filloni të punoni me OAuth, ndjenja e parë është se protokolli është shumë kompleks dhe i tepërt. Në këtë artikull, unë do të përpiqem të shpjegoj bazat e OAuth në terma njerëzorë.

Shembull i ndër-autorizimit

Le të kthehemi në vitin 2005 dhe të imagjinojmë se po shkruajmë një rrjet social. Ai përmban një formular për importimin e kontakteve nga libri i adresave të GMail. Çfarë ju nevojitet për të hyrë në kontaktet e GMail? Sigurisht, identifikimi dhe fjalëkalimi për kutinë postare. Por nëse kërkojmë t'i fusim në faqen tonë, përdoruesi do të dyshojë se diçka nuk shkon. Ku është garancia që nuk i ruajmë fjalëkalimet e futura në server? Prandaj, ne duam që të futet fjalëkalimi vetëm në faqen e internetit të GMail, dhe pas kësaj, qasja në kontakte përmes GMail API iu dha rrjetit tonë social (ndoshta përkohësisht). Le të biem dakord për kushtet.
  • Konsumatori: konsumatori; skript për përpunimin e formës së importimit të kontakteve në një rrjet social.
  • Ofrues shërbimi: ofruesi i të dhënave; GMail që përmban të dhëna të librit të adresave me interes për një Konsumator.
  • Përdoruesi: një përdorues që ka një llogari si me Konsumatorin ashtu edhe me Ofruesin e Shërbimit.
  • Burim i mbrojtur: te dhena Personale; kontaktet nga libri i adresave në GMail (d.m.th. burimet e Ofruesit të Shërbimit).
  • API-ja e ofruesit: GMail API që lejon çdo skript të marrë kontakte nga libri i adresave të GMail.
Detyra OAuth- për të bërë të mundur që Përdoruesi të punojë në shërbimin e Konsumatorit (në rrjetin social) me të dhënat e mbrojtura të Ofruesit të Shërbimit (GMail), duke futur fjalëkalimin për këto të dhëna ekskluzivisht në Ofruesin e Shërbimit dhe duke qëndruar në faqen e internetit të Konsumatorit. Jo aq e vështirë, apo jo?

Si ndryshon OAuth nga OpenID?

OAuth shpesh përmendet si "protokolli për robotët" në krahasim me OpenID, që është "protokolli për përdoruesit". Mos i ngatërroni!
  1. OpenID është një protokoll për regjistrim të përshpejtuar. OpenID i lejon një përdoruesi të marrë një llogari në çdo shërbim pa futur një fjalëkalim, nëse ai tashmë është i regjistruar diku tjetër në internet. (Dhe më pas mund të hyni në shërbim pa futur një fjalëkalim, duke u autorizuar "diku".) Për shembull, nëse keni një llogari Yandex, mund të "hyni" me të në çdo shërbim që mbështet autorizimin OpenID.
  2. OAuth është një protokoll për qasje të autorizuar në një API të palës së tretë. OAuth lejon që skripti i konsumatorit të fitojë akses të kufizuar në API në të dhënat e një Ofruesi të Shërbimeve të palëve të treta, nëse Përdoruesi është dakord. ato. është një mjet për të hyrë në API.

Analogjia e policisë

Imagjinoni që jeni një hetues kriminal që kërkon përfundime në një rast vjedhjeje të WebMoney të vitit 1973. Le të biem dakord për kushtet:
  • Konsumatori i OAuth: Hetimi penal.
  • Përdoruesi: punonjës i Departamentit të Hetimit Penal.
  • Ofrues shërbimi: Arkivi i dosjeve të krimeve.
  1. OpenID: një punonjës i Departamentit të Hetimit Kriminal (Përdorues) vjen te Ofruesi i Shërbimit, paraqet një Autorizim në hyrje dhe kalon përmes kartave në vend në kërkim të informacionit.
  2. OAuth: një punonjës i Departamentit të Hetimit Kriminal (Përdorues) drejtpërdrejt nga puna (Konsumatori) telefonon Ofruesin e Shërbimit. Ai raporton emrin e tij; nëse njihet (Autorizimi), ai kërkon një listë të të gjitha krimeve për vitin 1973 (thirrje API).
Siç mund ta shihni, OpenID dhe OAuth janë gjëra të ndryshme. OpenID ju lejon të aksesoni burime të caktuara në vend. OAuth siguron marrjen e një pjese informacioni nga një shërbim në distancë nëpërmjet një API.

Përmbledhje e këtij artikulli

Para se të kalojmë në pjesën kryesore, le të shohim saktësisht se si do të lëvizim.
  1. Le të shqyrtojmë problemet që lindin gjatë zbatimit "manual" të ndërautorizimit.
  2. Le të flasim se çfarë është një "aplikacion" dhe çfarë është një Konsumator.
  3. Le të prekim bazat e kriptografisë.
  4. Le të tregojmë aplikacionin demo që do të shkruajmë në këtë artikull.
  5. Le të vendosim për një server testues OAuth në të cilin do të eksperimentojmë.
  6. Le të kalojmë nëpër të gjitha hapat e protokollit OAuth dhe të japim burimet e skriptit.

Mbi shpikjen e biçikletës

Një mënyrë e mirë për të kuptuar diçka është ta bëni vetë, duke shkelur të gjitha raketat e vendosura gjatë rrugës. Tani do të rishpikim rrotën: le të përpiqemi të imagjinojmë se si do ta zgjidhnim problemin e ndërveprimit midis Konsumatorit dhe Ofruesit të Shërbimeve pa asnjë protokoll të standardizuar.

Së pari, ne do të shkruajmë vetë formularin për importimin e kontakteve nga GMail: Më pas, do t'u kërkojmë zhvilluesve të GMail të sigurohen që kur një përdorues të lundrojë në URI /auth.php, do t'i jepet një formular autorizimi (në botën tonë të çiklizmit , GMail është shkruar në PHP). Pas futjes me sukses të fjalëkalimit, përdoruesi duhet të ridrejtohet në sit, URL-ja e të cilit është e specifikuar në parametrin retpath. Gjithashtu, një çelës sekret shtesë duhet të kalojë në URL, i cili tashmë mund të përdoret për të hyrë në GMail API.

Pra, pasi të futni fjalëkalimin, përdoruesi do të kthehet në faqen tonë të internetit në adresën e mëposhtme: Dhe nga skripti /import.php, ne do të kthehemi te API GMail, do të kalojmë në të çelësin Y49xdN0Zo2B5v0RR dhe do të ngarkojmë kontaktet: Epo, tani le të numërojmë grabujën (sepse gungat do të jetë shumë vonë për t'u numëruar).

Radha e parë: zëvendësimi i rrugës së kthimit të adresës

Sigurisht, e keni marrë me mend se gjëja e parë që një sulmues do të bënte në faqen e tij do të postonte një lidhje dhe do t'ju detyronte të klikoni mbi të. Si rezultat, ai do të marrë çelësin sekret që GMail ktheu, dhe për këtë arsye kontaktet tuaja:

Gërshetimi i dytë: “përgjimi” i çelësit sekret

Supozoni se ne mbronim disi kthimin, dhe tani ai mund të tregojë vetëm faqen tonë. Por problemi me parametrin sekret mbetet. Sekreti mund të spiunohet nga pas ose të përgjohet duke dëgjuar trafikun WiFi. Ose, një ditë do të ketë një dobësi XSS në faqen tuaj që ju lejon të "vjedhni" çelësin sekret. Me vlerën sekrete, një sulmues do të jetë në gjendje të lexojë librin tuaj të adresave. Kjo do të thotë që ju duhet ta mbroni sekretin nga përgjimi (në mënyrë ideale, mos e transmetoni fare përmes URL-së).

Rake të tretën: shumë ridrejtime

Nëse çdo thirrje API kërkon një sekret të ndryshëm, atëherë do të na duhet të organizojmë aq ridrejtime në faqen e Ofruesit të Shërbimit sa kemi thirrje. Me përdorimin intensiv të API-së, kjo funksionon shumë ngadalë dhe është mjaft e papërshtatshme ...

Rake e katërta: identifikimi i dobët i Konsumatorit

GMail, natyrisht, dëshiron të dijë se kush po përdor API-në e tij. Lejo hyrjen në disa sajte dhe refuzo aksesin te të tjerat... Kjo do të thotë që kur formohet një kërkesë në formën e importimit të kontakteve, një Konsumator (sajt) duhet t'i "prezantohet" një Ofruesi të Shërbimit (GMail). Në rastin tonë, ky funksion kryhet pjesërisht nga retpath (emri i faqes në të), por kjo metodë nuk është universale, pasi Mekanizmi i "prezantimit" duhet të përdoret gjithashtu kur thirren metodat API.

Fondacioni OAuth

Vlen të përmendet se kanë mbetur ende shumë "grabitje nënujore". Unë nuk do t'i përshkruaj këtu, sepse kjo grabujë shtrihet në Hendekun Mariana (thellë, 10920 m). Do të duheshin një duzinë faqe për të përshkruar dobësitë. Kështu që unë do të kaloj direkt në përshkrimin e OAuth, ku të gjitha problemet tashmë janë zgjidhur.

Aplikacioni = Konsumator + Akses në API

Kur punoni me OAuth, është e rëndësishme që termi Konsumator të mos kufizohet në "faqe". Konsumatori është disa aplikacion, dhe se ku ndodhet nuk është aq e rëndësishme. Shembuj të Konsumatorëve nga jeta reale: Por ju nuk mund të gatuani qull vetëm nga OAuth. Në të vërtetë, gjithçka që jep OAuth është aftësia për t'u identifikuar në një shërbim në distancë (Ofruesi i Shërbimit) dhe për të bërë kërkesa të autorizuara në API. Nuk ka rëndësi se si funksionon kjo API: mund të jetë SOAP i pastër, qasje REST, etj. Gjëja kryesore është që çdo metodë API të pranojë parametra të veçantë të kaluar sipas protokollit OAuth si hyrje.

Token = Çelës + Sekret

Një nga parimet e OAuth thotë se asnjë çelës sekret nuk duhet të transmetohet publikisht në kërkesat (në shembullin e mësipërm, ne shikuam pse). Prandaj, protokolli funksionon me konceptin Token. Një shenjë është shumë e ngjashme me një palë hyrje + fjalëkalim: identifikimi është informacion publik dhe fjalëkalimi është i njohur vetëm për palët dërguese dhe marrëse. Në terma të OAuth, analogu i hyrjes quhet Key, dhe analogu i fjalëkalimit quhet Sekret. Situata kur Sekretin e di vetëm dërguesi dhe marrësi, por askush tjetër, quhet Sekret i përbashkët.

Pra, nëse Konsumatori dhe Ofruesi bien dakord disi për një Sekret të Përbashkët, ata mund të shkëmbejnë hapur çelësat përkatës (Çelësi) në URL, pa frikë se përgjimi i këtyre çelësave do të jetë i rrezikshëm. Por si ta mbroni URL-në me Key nga falsifikimi?

Mesazh = Dokument + Nënshkrim Dixhital

“Nënshkrimi dixhital” tingëllon i frikshëm, por në fakt është një gjë krejt e dukshme. Kur nënshkruani një dokument me stilolaps, vërtetoni se dokumenti është shkruar nga ju dhe jo nga dikush tjetër. Nënshkrimi juaj, si të thuash, "shtohet" në dokument dhe shkon me të në "një grup".

Po kështu, një nënshkrim dixhital i shtohet një blloku të dhënash, duke vërtetuar se ai që i ka krijuar këto të dhëna nuk imiton një tjetër. Një nënshkrim dixhital nuk e kodon një dokument, ai vetëm garanton vërtetësinë e tij! Nënshkrimi lejohet nga i njëjti Sekret i përbashkët, i cili është i njohur për marrësin dhe dërguesin, por askush tjetër.

Si punon? Lëreni $ sharedSecret tonë = 529AeGWg, dhe ne e pëshpëritëm në veshin e palës marrëse. Ne duam të dërgojmë mesazhin "Telefoni im 1234567" me mbrojtje të garantuar kundër falsifikimit nga një ndërhyrës.

  1. Konsumatori shton një nënshkrim dixhital në mesazh, në përgjithësi $ transfer = $ mesazh. "-". md5 ($ mesazh. $ sharedSecret); // $ transfer = "Telefoni im është 1234567". "-". md5 ("Telefoni im është 1234567". "529AeGWg")
  2. Ofruesi i Shërbimit i pranon të dhënat, i ndan përsëri në 2 pjesë - mesazh $ dhe nënshkrimi $ - dhe kryen saktësisht të njëjtin veprim: $ signatureToMatch = md5 ($ message. $ SharedSecret); // $ signatureToMatch = md5 ("Telefoni im është 1234567". "529AeGWg"); Pastaj mbetet vetëm të krahasojmë vlerën që rezulton $ signatureToMatch me atë që ishte në të dhënat e marra të nënshkrimit $ dhe të raportoni një të rremë nëse vlerat nuk përputhen.

Demonstrimi i OAuth duke përdorur një aplikacion të thjeshtë si shembull

Për ta "ndjerë" OAuth live, na duhen dy gjëra:
  1. Një skript që implementon anën e klientit të protokollit. Unë shkrova vetëm një skrip kaq të vogël PHP (lidhje me arkivin zip). Është një widget që mund të futet në faqet PHP.
  2. Një server OAuth testues me të cilin mund të eksperimentojmë. Për këtë qëllim, është i përshtatshëm të përdorni RuTvit: ekziston një faqe http://rutvit.ru/apps/new, e cila ju lejon të shtoni një aplikacion testimi në 30 sekonda. (Meqë ra fjala, nuk keni pse të specifikoni URL-në e kthimit në formular - ne do ta kalojmë atë gjithsesi nga skripti i testit.)
Duke parë kodin e skriptit demo dhe duke lexuar shpjegimet më poshtë në artikull, mund të kuptoni detajet e protokollit.

Ju mund ta futni këtë miniaplikacion në çdo sajt PHP thjesht duke kopjuar kodin e tij dhe duke rregulluar paraqitjen. Të gjitha tweet-et nga shërbimi RuTvit shfaqen, të shënuara me etiketën hash të specifikuar, dhe gjithashtu është e mundur të shtoni tweet-e të reja (këtu përdoret OAuth). Miniaplikacioni përdor autorizimin RuTvit API dhe OAuth, i cili, rastësisht, është i njëjtë me standardin API të Twitter. Ju mund ta ekzekutoni këtë skript në serverin tuaj të testimit. Për ta bërë këtë, duhet të kryeni tre hapa:

  1. Shkarkoni kodin e skriptit dhe vendoseni atë në çdo drejtori të përshtatshme në serverin e uebit.
  2. Regjistroni një aplikacion të ri testimi me serverin OAuth.
  3. Pas regjistrimit të aplikacionit, zëvendësoni parametrat OA_CONSUMER_KEY dhe OA_CONSUMER_SECRET në skript me vlerat e marra nga serveri.

Regjistrimi i aplikacionit dhe parametrat

Le të flasim se nga vijnë aplikacionet dhe si mëson Ofruesi i Shërbimit rreth tyre. Gjithçka është mjaft e thjeshtë: Ofruesi i Shërbimit ka një formular të veçantë regjistrimi të aplikimit që çdokush mund ta përdorë. Këtu është një shembull i një forme të tillë:


Pas regjistrimit të aplikacionit, ju jepen 5 parametra që kërkohen për të punuar me OAuth. Ja se si mund të duken:


Këtu çelësi i konsumatorit dhe sekreti i konsumatorit janë një lloj "hyrje + fjalëkalim" i aplikacionit tuaj (kujtoni bisedën për tokenat më lart? Ky është vetëm një prej tyre). Më lejoni t'ju kujtoj se sekreti i konsumatorit është një Sekret i përbashkët, i njohur vetëm për dërguesin dhe marrësin, por askush tjetër. 3 vlerat e tjera vendosin URL-të e shërbimit, kuptimin e të cilave do ta shqyrtojmë tani.

OAuth = Merr shenjën e kërkesës + Ridrejto te autorizimi + Merr shenjën e hyrjes + API-në e thirrjes

Në shembullin me GMail, kemi përdorur 2 lloje thirrjesh në distancë: a) ridrejtim përmes shfletuesit; b) thirrja e API-së nga brenda skriptit.

Dhe ne zbuluam një sërë çështjesh sigurie, gjë që sugjeron se duhet të ketë më shumë sfida. Kjo është ajo që ndodh në OAuth: kërkesa shtesë të ndërmjetme shtohen nga skripti i Konsumatorit te Ofruesi, duke funksionuar me token. Le t'i hedhim një sy atyre.

  1. Përpunimi i paraqitjes së formularit. Kjo nuk është pjesë e OAuth, por pjesë e aplikacionit tonë. Përpara se të kontaktojmë me ofruesin e API-së, duhet të marrim një urdhër pune nga përdoruesi për këtë veprim. Këtu është një shembull i një "urdhri" të tillë:
  2. Merr shenjën e kërkesës (kërkesë e brendshme).
    • Skripti Konsumator i referohet Kërko URL-në e shenjës Ofruesi: për shembull, api.rutvit.ru/oauth/request_token. Kërkesa transmeton çelësin e Konsumatorit - "hyrja në aplikacion", dhe vetë kërkesa nënshkruhet duke përdorur sekretin e konsumatorit - "fjalëkalimi i aplikacionit", i cili e mbron atë nga falsifikimi.
    • Si përgjigje, Ofruesi gjeneron dhe kthen një token të mbushur me mbeturina të quajtur Request Token. Do të na duhet ende, kështu që duhet ta ruajmë diku - për shembull, në ndryshoren e sesionit $ S_REQUEST_TOK.
  3. Ridrejto te Autorizim (përmes ridrejtimit të shfletuesit). Aplikacioni ynë tani ka një shenjë unike të kërkesës. Kërkohet të merret leje nga përdoruesi për të përdorur këtë shenjë, d.m.th. pyet atë autorizoni Request Token.
    • Konsumatori ridrejton shfletuesin në një speciale Autorizoni URL-në Ofruesi: për shembull, api.rutvit.ru/oauth/authorize. Kërkesa e çelësit të Tokenit kalohet në parametra.
    • Ofruesi shfaq një formular autorizimi për përdoruesin e tij dhe, nëse ai është i identifikuar, e ridrejton shfletuesin prapa. Ku saktësisht? Dhe ne e tregojmë këtë në parametrin oauth_callback.
  4. Merr shenjën e hyrjes (kërkesë e brendshme). Pra, shfletuesi u kthye në aplikacionin tonë pas një sërë ridrejtimesh. Kjo do të thotë se autorizimi për Ofruesin ishte i suksesshëm dhe Shenja e Kërkesës lejohet të funksionojë. Sidoqoftë, në OAuth, për sigurinë, çdo shenjë ka qëllimin e vet rreptësisht të kufizuar. Për shembull, Request Token përdoret vetëm për të marrë konfirmim nga përdoruesi dhe për asgjë tjetër. Për të hyrë në burime, duhet të marrim një shenjë të re - Access Token - ose, siç thonë ata, "të shkëmbejmë Request Token për Access Token".
    • Konsumatori i referohet Hyni në URL-në e shenjës- për shembull, api.rutvit.ru/oauth/access_token, - dhe kërkon t'i lëshojë atij një Token Access në vend të Tokenit të Kërkesës që ai ka. Kërkesa nënshkruhet me një nënshkrim dixhital bazuar në sekretin Request Token.
    • Ofruesi gjeneron dhe kthen një Token Access të mbushur me mbeturina. Ai gjithashtu shënon në tabelat e tij se qasja në API lejohet për këtë Token Access. Aplikacioni ynë duhet të mbajë Token Access nëse do të përdorë API-në në të ardhmen.
  5. Call API (kërkesë e brendshme). Epo, tani kemi një Access Token dhe mund ta kalojmë çelësin e tij kur thërrasim metodat API.
    • Konsumatori gjeneron një kërkesë për Ofruesin API (për shembull, duke përdorur një kërkesë POST sipas ideologjisë REST). Çelësi i Tokenit të Accessit transmetohet në kërkesë dhe nënshkruhet duke përdorur Sekretin e përbashkët të këtij tokeni.
    • Ofruesi trajton thirrjen API dhe kthen të dhënat në aplikacion.

Fundi i skenarit: shfaqja e miniaplikacionit

Fundi i skenarit duhet të jetë i qartë dhe pa shpjegime të hollësishme.
Listimi 14: Mbyllja e skriptit: shfaqja e miniaplikacionit
// rasti i fundit)) // Merrni të gjitha cicërimat e disponueshme. $ text = file_get_contents ("http://api.rutvit.ru/search.xml?rpp=5&q=". urlencode ("#". TAG)); $ TWEETS = SimpleXMLElement i ri ($ tekst); // Shkurtore për shfaqjen e një mesazhi me rikodim dhe citim. funksioni e ($ text, $ quote = 1) ($ text = iconv ("utf-8", ENCODING, $ text); echo $ quote? htmlspecialchars ($ text): $ text;)?>
statusi si tweet i $) (?>
përdorues-> emri_ekran)?>: teksti_formatuar, 0)?>
? action = form_is_sent "style =" margin: 1em 0 0 0 ">

Lidhje të dobishme të OAuth

  • rutvit
Shto etiketa

Artikujt kryesorë të lidhur