OAuth 2.0 - The Good, The Bad & The Ugly

In een wereld die gedomineerd wordt door sociale media, is het moeilijk om een ​​clienttoepassing niet te vinden die je hebt gebruikt om toegang te krijgen tot beperkte bronnen op een andere server. Je hebt bijvoorbeeld een webtoepassing (zoals NY Times) gebruikt om een interessant nieuwsartikel op je Facebook-wall of tweet erover. Of misschien hebt u de iPhone-app van Quora gebruikt die toegang biedt tot uw Facebook- of Google+ profiel en kunt u de resultaten aanpassen op basis van uw profielgegevens, zoals het voorstellen om andere gebruikers toe te voegen / uit te nodigen voor Quora, op basis van uw vriendenlijst. De vraag is, hoe krijgen deze applicaties toegang tot uw Facebook-, Twitter- of Google+ accounts en hoe kunnen ze toegang krijgen tot uw vertrouwelijke gegevens? Voordat ze dit kunnen doen, moeten ze een of andere vorm van authenticatiereferenties en autorisatiesubsidies voor de bronserver presenteren.


Inleiding tot OAuth 2.0

OAuth wordt vaak omschreven als een valet-sleutel voor het web.

Nu zou het echt zijn niet cool om uw Facebook- of Google-inloggegevens te delen met een externe clienttoepassing die alleen over uw vrienden hoeft te weten, omdat deze niet alleen onbegrensde en ongewenste toegang tot uw account biedt, maar deze heeft ook de inherente zwakte verbonden aan wachtwoorden. Hier komt OAuth om de hoek kijken, omdat het een kader voor toegangsdelegatie / autorisatie schetst dat kan worden gebruikt zonder dat het nodig is om wachtwoorden te delen. Om deze reden wordt OAuth vaak omschreven als een valet-sleutel voor het web. Het kan worden gezien als een speciale sleutel die toegang biedt tot beperkte functies en voor een beperkte periode zonder volledige controle weg te geven, net zoals de valet-sleutel voor een auto de parkeerwachter toestaat om de auto over een korte afstand te besturen, blokkeren toegang tot de kofferbak en de mobiele telefoon aan boord.

OAuth is echter geen nieuw concept, maar een standaardisatie en gecombineerde wijsheid van vele gevestigde protocollen. Ook vermeldenswaard is dat OAuth niet alleen beperkt is tot sociale-mediatoepassingen, maar ook een gestandaardiseerde manier biedt om informatie veilig te delen tussen verschillende soorten toepassingen die hun API's blootstellen aan andere toepassingen. OAuth 2.0 heeft een compleet nieuw proza ​​en is niet achterwaarts compatibel met zijn voorganger. Dat gezegd hebbende, zou het goed zijn om eerst een paar basiswoordenlijsten van OAuth2.0 te bespreken voordat je verder gaat met meer details.

  • Resource-eigenaar : Een entiteit die toegang tot een beschermde bron kan verlenen. Meestal is het een eindgebruiker.
  • Cliënt : Een toepassing die verzoeken om beschermde bronnen namens de eigenaar van de bron en met zijn autorisatie uitvoert. Het kan een servergebaseerde, mobiele (native) of een desktop-applicatie zijn.
  • Resource-server : De server die de beschermde bronnen host en die in staat is om verzoeken om beschermde bronnen te accepteren en erop te reageren.
  • Autorisatieserver : De server geeft toegangsbeurzen / tokens aan de client na het succesvol verifiëren van de broneigenaar en het verkrijgen van autorisatie.
  • Toegangstoken : Toegangstokens zijn inloggegevens die door de client aan de bronserver worden aangeboden om toegang te krijgen tot beschermde bronnen. Het is normaal gesproken een string die bestaat uit een specifiek bereik, levensduur en andere toegangsattributen en die zelf de autorisatie-informatie kan bevatten op een verifieerbare manier.
  • Token vernieuwen : Hoewel de toegangstokens niet verplicht worden gesteld door de specificatie, hebben ze idealiter een vervaltijd die van enkele minuten tot meerdere uren kan duren. Zodra een toegangstoken is verlopen, kan de client de verificatieserver verzoeken om een ​​nieuw toegangstoken uit te geven met behulp van het verversingstoken dat is uitgegeven door de autorisatieserver.

Wat is er mis met OAuth 1.0?

OAuth 1.0's belangrijkste nadeel was de inherente complexiteit die nodig was om de specificatie te implementeren.

Eigenlijk niets! Twitter werkt nog steeds prima met OAuth 1.0 en is net begonnen met het ondersteunen van een klein deel van de 2.0-specificatie. OAuth 1.0 was een weloverwogen spec en het maakte de uitwisseling van geheime informatie veilig mogelijk zonder de overhead die werd opgelegd door SSL. De reden waarom we een opknapbeurt nodig hadden, was grotendeels gebaseerd op de complexiteit waarmee de spec werd geconfronteerd. Het volgende zijn enkele gebieden waarop OAuth 1.0 niet indruk kon maken:

  • Ondertekenen van elk verzoek : Als de client handtekeningen genereert bij elke API-aanvraag en deze valideert op de server telkens wanneer een aanvraag wordt ontvangen, bleek dit een grote tegenvaller voor ontwikkelaars te zijn, omdat ze de parameters moesten parseren, coderen en sorteren voordat ze een aanvraag deden. OAuth 2.0 heeft deze complexiteit verwijderd door eenvoudigweg de tokens over SSL te verzenden en hetzelfde probleem op netwerkniveau op te lossen. Er zijn geen handtekeningen vereist met OAuth 2.0.
  • Native applicaties adresseren : Met de evolutie van native applicaties voor mobiele apparaten leek de web-gebaseerde stroom van OAuth 1.0 inefficiënt, waardoor het gebruik van user-agents zoals een webbrowser verplicht was. OAuth 2.0 heeft meer stromen geschikt gemaakt die specifiek geschikt zijn voor native applicaties.
  • Duidelijke scheiding van rollen : OAuth 2.0 biedt de hoognodige scheiding van rollen voor de machtigingsserver die de client verifieert en autoriseert, en die van de API-oproepen voor de resource server die toegang hebben tot beperkte bronnen.

OAuth 2.0 in diepte

Voordat het protocol wordt gestart, moet de client zich registreren bij de machtigingsserver door het clienttype, de omleidings-URL (waar deze naar de machtigingsserver moet omleiden nadat de broneigenaar de toegang verleent of weigert) en alle andere informatie die door de server is vereist, te verstrekken en op zijn beurt krijgt een client-id (client-ID) en client-secret (client_secret). Dit proces staat bekend als klantregistratie. Na registratie kan de client een van de volgende flows aannemen om met de server te communiceren.

Verschillende OAuth-stromen

OAuth 2.0 brengt vijf nieuwe flows naar de tafel en biedt ontwikkelaars de flexibiliteit om een ​​van deze flows uit te voeren, afhankelijk van het type cliënt dat betrokken is:

  • User-Agent Flow : Geschikt voor clients die doorgaans worden geïmplementeerd in user-agents (bijvoorbeeld clients die in een webbrowser worden uitgevoerd) met behulp van een scripttaal zoals JavaScript. Meestal gebruikt door native applicaties voor mobiel of desktop, gebruikmakend van de ingesloten of externe browser als de user-agent voor autorisatie en het gebruikt de Impliciete Grant machtiging.
  • Webserverstroom : Dit maakt gebruik van de Authorisatie Code verlenen en is een op omleiding gebaseerde stroom die interactie vereist met de user-agent van de eindgebruiker. Het is dus het meest geschikt voor clients die deel uitmaken van webserverapplicaties, die meestal via een webbrowser worden gebruikt.
  • Gebruikersnaam en wachtwoordstroom : Wordt alleen gebruikt als er een hoge vertrouwensrelatie bestaat tussen de client en de broneigenaar en wanneer andere stromen niet haalbaar zijn, omdat het de overdracht van de inloggegevens van de broneigenaar betreft. Voorbeelden van clients kunnen een apparaatbesturingssysteem of een zeer bevoorrechte toepassing zijn. Dit kan ook worden gebruikt om bestaande clients met HTTP-basis- of verestverificatieprogramma's naar OAuth te migreren door de opgeslagen gegevens naar een toegangstoken te converteren.
  • Assertion Flow : Uw cliënt kan een bewering zoals SAML Assertion aanbieden aan de autorisatieserver in ruil voor een toegangstoken.
  • Stroom van klantreferenties : OAuth wordt voornamelijk gebruikt voor gedelegeerde toegang, maar er zijn gevallen waarin de klant de bron bezit of de gedelegeerde toegang al heeft gekregen buiten een standaard OAuth-stroom. Hier kunt u gewoon clientreferenties uitwisselen voor een toegangstoken.

Elke stroom in detail bespreken zou buiten het bestek van dit artikel vallen en ik raad het lezen van de specificatie voor diepgaande stroominformatie liever aan. Maar om een ​​idee te krijgen van wat er gaande is, gaan we dieper in op een van de meest gebruikte en ondersteunde flows: The Web Server Flow.

De webserverstroom

Aangezien dit een op omleiding gebaseerde stroom is, moet de client in staat zijn om te communiceren met de user agent van de broneigenaar (die in de meeste gevallen een webbrowser is) en is daarom typisch geschikt voor een webapplicatie. Het onderstaande diagram is een overzicht in vogelvlucht van hoe de eindgebruiker (of de broneigenaar) de clienttoepassing (in dit geval webserver-gebaseerde applicatie) gebruikt voor authenticatie en autorisatie met de autorisatieserver om toegang te krijgen tot de beschermde bronnen door de bronserver.


Authenticatie en machtiging van de klant

De client initieert namens de broneigenaar de stroom door om te leiden naar het autorisatie-eindpunt met een parameter response_type als code, een client-ID, die wordt verkregen tijdens clientregistratie, een omleidings-URL, een aangevraagd bereik (optioneel) en een lokale status (indien aanwezig). Om een ​​indruk te krijgen van hoe het werkt, ziet u hier een screenshot van hoe een typisch verzoek / reactie eruit zou zien:


Dit stelt de eigenaar van de bron gewoonlijk voor met een webinterface, waar de eigenaar kan verifiëren en controleren wat alle machtigingen zijn die de client-app namens de eigenaar mag gebruiken.


Ervan uitgaande dat de broneigenaar toegang verleent aan de client, stuurt de machtigingsserver de user-agent door naar de client met behulp van de eerder verstrekte omleidings-URL, samen met de autorisatiecode zoals weergegeven door de onderstaande reactie.


Exchange Autorisatiecode voor tokens

De klant dan posts naar een ander autorisatie-eindpunt en verzendt de autorisatiecode die is ontvangen in de eerdere stap, samen met de omleidings-URL, de client-ID en het geheim ervan, verkregen tijdens clientregistratie en een parameter grant_type moet worden ingesteld als Authorisatie Code.


De server valideert vervolgens de autorisatiecode en verifieert dat de omleidings-URL dezelfde is als in de vorige stap. Als dit lukt, antwoordt de server terug met een toegangstoken en optioneel een vernieuwingstoken.


Beperkte bronnen aanvragen met toegangstokens

De client kan nu de API's gebruiken die door de implementatie worden geleverd en kan de bronserver vragen om een ​​beperkte resource door het toegangstoken door te geven in de autorisatiekop van de aanvraag. Een voorbeeld van een CURL-verzoek aan de Blogger API van Google om een ​​blog te krijgen, gezien de ID, zou er als volgt uitzien:

 $ curl https://www.googleapis.com/blogger/v3/blogs/5223788876950011016 -H 'Autorisatie: OAuth ya29.AHES6ZRTj1GNxAby81Es-p_YPWWNBAFRvBYVsYj2HZJfJHU'

Merk op dat we het toegangstoken als autorisatiekop in het verzoek hebben toegevoegd en ook aan het token zijn ontsnapt door het op te nemen in enkele aanhalingstekens, omdat het token speciale tekens kan bevatten. Onthoud dat ontsnappen aan het toegangstoken alleen nodig is bij het gebruik van krullen. Het resulteert in het verzenden van de volgende aanvraag:


De bronserver verifieert vervolgens de doorgegeven referenties (toegangstoken) en reageert, indien succesvol, met de gevraagde informatie.


Deze voorbeelden zijn afkomstig van OAuth2.0 Playground en zijn typerend voor hoe Google de specificaties implementeert. Verschillen kunnen worden waargenomen bij het proberen van dezelfde stroom met andere providers (zoals Facebook of Salesforce) en dit is waar interoperabiliteitsproblemen binnensluipen, die we een beetje later bespreken.

Toegangstoken vernieuwen

Hoewel niet vereist door de spec, maar meestal zijn de toegangstokens van korte duur en hebben ze een vervaltijd. Dus wanneer een toegangstoken is verlopen, verzendt de client het vernieuwingstoken naar de machtigingsserver, samen met diens client-ID en geheim, en een parameter grant_type als refresh_token.


De machtigingsserver antwoordt vervolgens terug met de nieuwe waarde voor het toegangstoken.


Hoewel er een mechanisme bestaat om het uitgegeven vernieuwingstoken in te trekken, maar normaal gesproken leeft het verversingstoken voor eeuwig en moet als een geheime waarde worden beschermd en behandeld.


Wat is er mis met OAuth 2.0?

Het goede spul

Gegeven door de acceptatiegraad, is OAuth 2.0 absoluut een verbetering ten opzichte van zijn geheimzinnige voorganger. Voorbeelden van ontwikkelaarsgemeenschappen die haperen tijdens het implementeren van de handtekeningen van 1.0 zijn niet onbekend. OAuth 2.0 biedt ook verschillende nieuwe subsidietypen, die kunnen worden gebruikt om veel gebruiksmogelijkheden zoals native applicaties te ondersteunen, maar de USP van deze specificatie is de eenvoud ten opzichte van de vorige versie.

De slechte delen

Er zijn een paar losse eindjes in de specificatie, omdat het er niet in slaagt om een ​​paar vereiste componenten goed te definiëren of laat over aan de implementaties om te beslissen, zoals:

Losse uiteinden in de OAuth 2.0-specificatie zullen waarschijnlijk een breed scala aan niet-interoperabele implementaties produceren.

  • interoperabiliteit: Het toevoegen van te veel uitbreidingspunten in de specificatie resulteerde in implementaties die niet compatibel zijn met elkaar, wat dat betekent is dat je niet kunt hopen een generiek stuk code te schrijven dat gebruikt Eindpuntdetectie om te weten over de eindpunten die door de verschillende implementaties worden gegeven en met hen te communiceren, zou je liever afzonderlijke stukjes code moeten schrijven voor Facebook, Google, Salesforce enzovoort. Zelfs de spec erkent dit falen als een disclaimer.
  • Short Lived Tokens: De specificatie geeft geen mandaat voor de levensduur en het bereik van de uitgegeven tokens. De implementatie is gratis om een ​​token voor altijd te laten leven. Hoewel de meeste implementaties ons kortstondige toegangstokens en een verversingstoken verschaffen, die kunnen worden gebruikt om een ​​nieuw toegangstoken te krijgen.
  • Veiligheid: De specificatie "beveelt" alleen het gebruik van SSL / TLS aan terwijl de tokens in platte tekst over de draad worden verzonden. Hoewel elke grote implementatie het tot een vereiste heeft gemaakt dat beveiligde autorisatie-eindpunten vereisen dat de client een beveiligde omleidings-URL moet hebben, anders is het veel te gemakkelijk voor een aanvaller om de communicatie af te luisteren en de tokens te ontcijferen..

De lelijke spat

Het kostte IETF ongeveer 31 conceptversies en het ontslag van de hoofdauteur / ontwikkelaar Eran Hammer van de commissie om de specificatie uiteindelijk te publiceren. Eran leidde tot een controverse door de specificatie te noemen "een slecht protocol en een doodsgeval door duizend keer knippen". Volgens hem was het gebruik van bearer tokens (verzenden van tokens via SSL zonder ondertekening of andere verificatie) over de gebruiker van handtekeningen (of MAC-tokens), gebruikt in OAuth 1.0 om het verzoek te ondertekenen, een slechte zet en een resultaat van verdeling van interesses tussen het web en enterprise communities.


Afsluitende opmerkingen

De specificatie laat zeker veel uitbreidingspunten open, resulterend in implementaties die hun eigen parameters introduceren, naast wat de specificatie al definieert, en zorgt ervoor dat implementaties van verschillende providers niet met elkaar kunnen samenwerken. Maar uitgaande van de populariteit en acceptatiegraad van dit framework, waarbij elke grote speler in de stad (Google, Twitter, Facebook, Salesforce, Foursquare, Github etc.) het implementeert en aanpast zoals het hen uitkomt, is OAuth alles behalve een mislukking . Elke webtoepassing die van plan is zijn API's aan andere webtoepassingen beschikbaar te stellen, moet in feite een vorm van verificatie en autorisatie ondersteunen en OAuth past hier de factuur.

Voor meer informatie

  • OAuth en de weg naar de hel
  • OAuth - een inleiding
  • RFC 5849 - OAuth1.0 spec
  • RFC 6749 - OAuth2.0 spec