Vra

Ek probeer om my manier om die OAuth spec, sy behoeftes en enige implementering ek kan vind en, so ver, dit regtig lyk soos meer moeilikheid as die moeite werd vind omdat ek sukkel om 'n enkele hulpbron wat trek dit alles saam. Of miskien is dit net dat ek is op soek na iets meer gespesialiseerd as die meeste handleidings.

Ek het 'n stel van bestaande API's - sommige in Java, sommige in PHP - wat ek nou nodig het om te verseker en, vir 'n aantal redes, OAuth lyk soos die regte manier om te gaan. Ongelukkig, my onvermoë om op te spoor die reg om hulpbronne om my te help kry 'n verskaffer aan die gang is 'n uitdaging wat teorie. Aangesien die meeste van hierdie stelsel-tot-stelsel API gebruik sal wees, sal ek nodig het om 'n 2-been verskaffer te implementeer. Met dit in gedagte ...

  1. Is daar iemand weet van enige goeie tutoriale vir die implementering van 'n 2-been OAuth verskaffer met PHP?
  2. Gegewe dat ek beveilig aanvaarde APIs in 2 tale, het ek nodig om 'n verskaffer te implementeer in beide of is daar 'n manier om die verskaffer as 'n "front kontroleerder" dat ek alle versoeke kan tregter deur te skep?
  3. Wanneer die beveiliging van PHP dienste, byvoorbeeld, moet ek elke API individueel beveilig deur die insluiting van die nodige hulpbronne verskaffer op elke?

Dankie vir jou hulp.

Was dit nuttig?

Oplossing

Ek sou 'n stap terug te neem en te dink oor wat 'n behoorlik gewaarmerk kliënt gaan stuur jou.

Kan jy die sleutels en geloofsbriewe in 'n gemeenskaplike databasis wat toeganklik vanaf albei stelle van dienste is te slaan, en net te implementeer die OAuth verskaffer in een taal? Wanneer die gebruiker stuur in 'n versoek om 'n diens (PHP of Java) dan kyk jy teen die algemene winkel. Wanneer die gebruiker is die oprigting van die OAuth kliënt dan kan jy doen dit alles deur óf 'n PHP of Java app (jou voorkeur), en die geloofsbriewe te stoor in die algemeen DB.

Daar is 'n paar Oauth verskaffers geskryf in ander tale wat jy dalk wil 'n blik op:

Ander wenke

Rob, nie seker waar jy beland op hierdie maar wou my 2 sent in geval iemand anders gehardloop voeg oor hierdie vraag.

Ek meer of minder het dieselfde vraag 'n paar maande gelede en hoor oor "OAuth" vir die beter deel van 'n jaar. Ek is besig om 'n REST API ek nodig het om te verseker so ek begin lees oor OAuth ... en dan my oë begin rol terug in my kop.

Ek het waarskynlik dit 'n goeie soliede dag of 2 van skimming en lees totdat ek besluit, net soos jy, wat OAuth is verwarrend vullis en net moed opgegee op dit.

So dan het ek begin navorsing doen oor maniere om veilige API in die algemeen en begin om 'n beter begrip oor hoe om dit te doen te kry. Die mees gewilde manier gelyk versoeke om die API saam te stuur met 'n checksum van die hele boodskap (geïnkripteer met 'n geheim dat net jy en die bediener weet) dat die bediener kan gebruik om te besluit of die boodskap gepeuter is op dit se manier van die kliënt, soos so:

  1. kliënt stuur /user.json/123?showFriends=true&showStats=true&checksum=kjDSiuas98SD987ad
  2. Server kry alles wat, kyk op die gebruiker "123" in die databasis, vragte sy geheime sleutel en dan (met behulp van dieselfde metode die kliënt gebruik) her-bereken sy eie checksum gegee versoek argumente.
  3. As die bediener se gegenereer checksum en gestuur checksum die kliënt se grootgeword het, die versoek is OK en uitgevoer word, indien nie, dit word beskou as gepeuter en verwerp.

Die checksum word 'n HMAC en as jy wil 'n goeie voorbeeld van hierdie, dit is wat Amazon Web Services gebruike (hulle noem die argument 'handtekening' nie 'checksum' al).

So gegee dat een van die belangrikste komponente van hierdie werk is dat die kliënt en bediener moet die HMAC op dieselfde manier (anders sal hulle nie ooreen) te genereer, daar moet reëls oor HOE om te kombineer wees al die argumente ... dan het ek skielik verstaan ??alles wat "natuurlike byte-bestelling van parameters" kak uit OAuth ... dit is net die definisie van die reëls vir hoe om die handtekening te genereer omdat dit nodig is om.

'n Ander punt is dat elke param jy sluit in die HMAC generasie is 'n waarde wat dan nie kan gepeuter wanneer jy die versoek stuur.

As jy dus net enkodeer die URI stuit as die handtekening, byvoorbeeld:

  • /user.json == askJdla9 / kjdas + Askj2l8add

dan die enigste ding wat in jou boodskap wat nie kan gepeuter is die URI, al die argumente kan gepeuter, want hulle is nie deel van die "checksum" waarde wat die bediener sal weer bereken.

As alternatief, selfs as jy sluit ELKE param in die berekening, jy nog steeds loop die risiko van 'n herhaling aanvalle "waar 'n kwaadwillige middelman of evesdropped n API oproep kan onderskep en hou net weer in dit aan die bediener oor en oor weer.

Jy kan regmaak wat deur die toevoeging van 'n tyd stempel (altyd gebruik UTC) in die berekening HMAC sowel.

ONTHOU: Sedert die bediener moet dieselfde HMAC bereken, wat jy hoef te stuur langs enige waarde wat jy in die berekening gebruik as julle geheime sleutel (OAuth noem dit 'n consumer_secret ek dink). So as jy die datum en tyd by te voeg, maak seker dat jy 'n tyd stempel param stuur saam met jou versoek.

As jy wil maak van die API te beveilig van herhaling aanvalle, kan jy 'n nonce waarde gebruik (dit is 'n 1-tyd gebruik waarde van die bediener genereer, gee aan die kliënt, die kliënt gebruik dit in die HMAC, stuur terug die versoek die bediener bevestig en dan punte wat nonce waarde as "gebruik" in die DB en nooit laat 'n ander versoek gebruik dit weer).

Nota: 'nonce "is 'n baie presiese manier om die" herhaling aanval "probleem op te los - tyd tempel is groot, maar omdat rekenaars nie altyd in-sync tyd stempel waardes, jy het 'n aanvaarbare venster op die toelaat bediener kant van hoe "oud" 'n versoek kan wees (sê 10 minute, 30 minute, 1 uur .... Amazon gebruik 15 min) voordat ons aanvaar of verwerp dit. In hierdie scenario jou API is tegnies kwesbaar tydens die hele venster van tyd.

Ekdink nonce waardes is groot, maar moet net nodig het om gebruik te word in APIs wat van kritieke belang is hulle hul integriteit te hou. In my API, het ek nie nodig het nie, maar dit sou triviale om later te voeg indien gebruikers geëis dit wees ... Ek sou letterlik net nodig het om 'n "nonce" tafel in my DB voeg, bloot 'n nuwe API aan kliënte soos:

  • /nonce.json

en dan wanneer hulle dit terug na my in die HMAC berekening stuur, sou ek nodig het om die DB check om seker te maak dit nog nooit gebruik voor en een keer gebruik word, merk dit as sodanig in die DB so as 'n versoek is ooit weer met dieselfde nonce sou ek dit verwerp.

Opsomming

In elk geval, om 'n lang storie kort te maak, alles wat ek net beskryf is basies wat bekend staan ??as "2-been OAuth". Daar is nie so bygevoeg stap van vloei na die owerheid (Twitter, Facebook, Google, wat ook al) aan die kliënt magtig, wat stap verwyder en plaas die bediener implisiet vertrou die kliënt indien die HMAC is hulle stuur wedstryd up. Dit beteken dat die kliënt het die reg secret_key en is dit te onderteken se boodskappe met dit, so die bediener trusts nie.

As jy online begin rondkyk, lyk dit na die voorkeur-metode vir die verkryging van API metodes nou-adays, of iets soos dit. Amazon gebruik byna presies hierdie metode as hulle 'n effens ander kombinasie metode vir hul parameters gebruik voor die ondertekening van die hele ding aan die HMAC genereer.

As jy belangstel Ek is geskryf op hierdie hele reis en deurdagte proses as ek dit leer. Wat kan help voorsien 'n begeleide denke toer van hierdie proses.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top