OAuth 2.0 - The Good, The Bad & The Ugly

I en värld som domineras av sociala medier är det svårt att inte komma över en kundansökan som du har använt för att få tillgång till begränsade resurser på någon annan server, till exempel kan du ha använt ett webbaserat program (som NY Times) för att dela en intressant nyhetsartikel på din Facebook-vägg eller tweet om det. Eller du kanske har använt Quoras iPhone-app som åtkomst till din Facebook- eller Google+ profil och anpassar resultaten utifrån dina profildata, som föreslår att du lägger till / bjuder in andra användare till Quora, baserat på din vänlista. Frågan är hur kan dessa applikationer få tillgång till dina Facebook-, Twitter- eller Google+ konton och hur kan de få tillgång till dina konfidentiella uppgifter? Innan de kan göra det måste de presentera någon form av autentiseringsuppgifter och auktorisationsbidrag till resursservern.


Introduktion till OAuth 2.0

OAuth beskrivs ofta som en valet nyckel för webben.

Nu skulle det verkligen vara uncool att dela dina Facebook- eller Google-uppgifter med någon tredje parts klientprogram som bara behöver veta om dina vänner, eftersom det inte bara ger appen gränslös och oönskad åtkomst till ditt konto, men det har också den inneboende svagheten som är associerad med lösenord. Det är här OAuth kommer till spel, eftersom det beskriver en åtkomstdelegation / behörighetsram som kan användas utan att behöva dela lösenord. Av denna anledning beskrivs OAuth ofta som en valet nyckel för webben. Det kan betraktas som en specialnyckel som tillåter åtkomst till begränsade funktioner och under en begränsad tid utan att ge bort full kontroll, precis som valetknappen för en bil tillåter parkeringsvakt att köra bilen för en kort sträcka, blockerar tillgång till bagageutrymmet och mobiltelefonen ombord.

OAuth är dock inte ett nytt koncept, utan en standardisering och kombinerad visdom av många väl etablerade protokoll. OAuth är inte bara begränsat till sociala medier, utan ger också ett standardiserat sätt att dela information säkert mellan olika typer av applikationer som exponerar deras API till andra applikationer. OAuth 2.0 har en helt ny prosa och är inte bakåtkompatibel med sin föregångare spec. Med detta sagt skulle det vara bra att först täcka några grundläggande OAuth2.0-ordförråd innan du dykar in i ytterligare detaljer.

  • Resursägare : En enhet som kan ge tillgång till en skyddad resurs. För det mesta är det en slutanvändare.
  • Klient : En ansökan som gör skyddade resursförfrågningar på resursinnehavarens vägnar och med dess auktorisation. Det kan vara en serverbaserad, mobil (inbyggd) eller en stationär applikation.
  • Resursserver : Servern är värd för skyddade resurser, som kan acceptera och svara på skyddade resursförfrågningar.
  • Auktoriseringsserver : Servern som utfärdar åtkomst beviljar / tokens till klienten efter att ha godkänt resursägaren och godkänt.
  • Åtkomsttoken : Tillgångstoken är referenser som presenteras av klienten till resursservern för att få tillgång till skyddade resurser. Det är normalt en sträng som består av en specifik räckvidd, livstid och andra åtkomstattribut och det kan själv innehålla auktoriseringsinformation på ett kontrollerbart sätt.
  • Uppdatera Token : Även om det inte är tillåtet av specifikationen, har access tokens helst en utgångstid som kan variera från några minuter till flera timmar. När en åtkomsttoken har löpt ut kan klienten begära att auktorisationsservern ska utfärda en ny åtkomsttoken med hjälp av uppdateringstoken utfärdat av auktoriseringsservern.

Vad är fel med OAuth 1.0?

OAuth 1.0: s största nackdel var den inneboende komplexiteten som behövdes för att implementera specifikationen.

Ingenting egentligen! Twitter fungerar fortfarande bra med OAuth 1.0 och har precis börjat stödja en liten del av 2.0 spec. OAuth 1.0 var en väl genomtänkt specifikation och det var tillåtet att utbyta hemlig information säkert utan att SSL påförde kostnaderna. Anledningen till att vi behövde en uppgradering var mestadels baserat på komplexiteten inför införandet av specifikationen. Nedan följer några områden där OAuth 1.0 inte kunde imponera:

  • Underteckna varje begäran : Att ha klienten genererar signaturer på varje API-begäran och validerar dem på servern varje gång en begäran mottas visade sig vara ett stort bakslag för utvecklare, eftersom de var tvungna att analysera, koda och sortera parametrarna innan de begärde. OAuth 2.0 tog bort denna komplexitet genom att helt enkelt skicka token över SSL och lösa samma problem på nätverksnivå. Inga signaturer krävs med OAuth 2.0.
  • Adressera inbyggda applikationer : Med utvecklingen av inhemska applikationer för mobila enheter verkade det webbaserade flödet av OAuth 1.0 ineffektivt, vilket gav upphov till användaragenter som en webbläsare. OAuth 2.0 har rymt fler flöden som är speciellt lämpliga för inhemska applikationer.
  • Tydlig separation av roller : OAuth 2.0 ger den väldigt nödvändiga åtskillnaden mellan roller för godkännandeservern som autentiserar och godkänner klienten, och det som används i API: n för hantering av resursservern kräver att man får tillgång till begränsade resurser.

OAuth 2.0 i djup

Innan protokollet initieras måste klienten registrera sig hos auktorisationsservern genom att tillhandahålla dess klienttyp, dess omdirigeringsadress (där den vill att auktorisationsservern ska omdirigera till efter att resursägaren ger eller avvisar åtkomsten) och annan information som krävs av servern och i sin tur ges en klientidentifierare (client_id) och klienthemlighet (client_secret). Denna process är känd som kundregistrering. Efter att ha registrerats kan klienten anta ett av följande flöden för att interagera med servern.

Olika OAuth-flöden

OAuth 2.0 ger fem nya flöden till bordet och ger utvecklare flexibiliteten att implementera någon av dem, beroende på vilken typ av kund som är involverad:

  • User-Agent Flow : Lämplig för kunder som vanligtvis implementeras i användaragenter (till exempel klienter som körs i en webbläsare) med ett skriptspråk som JavaScript. Används mest av inhemska applikationer för mobil eller skrivbord, vilket utnyttjar den inbäddade eller externa webbläsaren som användaragent för behörighet och använder den Implicit Grant tillstånd.
  • Webserverflöde : Detta använder sig av Behörighetskod bevilja och är ett omriktningsbaserat flöde som kräver interaktion med slutanvändarens användaragent. Således är den mest lämplig för kunder som ingår i webbservern baserade applikationer, som vanligtvis är åtkomliga via en webbläsare.
  • Användarnamn och lösenord flöde : Används endast när det finns högt förtroende mellan kunden och resursägaren och när andra flöden inte är genomförbara, eftersom det innebär överföring av resursägarens referenser. Exempel på klienter kan vara ett operativsystem eller en mycket privilegierad applikation. Detta kan också användas för att migrera befintliga klienter som använder HTTP Basic eller Digest Authentication-scheman till OAuth genom att konvertera de lagrade referenserna till en åtkomsttoken.
  • Assertion Flow : Din klient kan presentera ett påstående som SAML Assertion till auktorisationsservern i utbyte mot en åtkomsttoken.
  • Client Credentials Flow : OAuth används huvudsakligen för delegerad åtkomst, men det finns fall där kunden äger resursen eller redan har beviljats ​​den delegerade åtkomsten utanför ett typiskt OAuth-flöde. Här utbyter du bara klientuppgifter för ett åtkomsttoken.

Att diskutera varje flöde i detalj skulle vara utanför ramen för denna artikel och jag skulle hellre rekommendera att läsa specifikationen för djup flödesinformation. Men för att få en känsla för vad som händer, låt oss gräva djupare in i ett av de mest använda och stödda flödena: Web Server Flow.

Webserverflödet

Eftersom detta är ett omriktningsbaserat flöde, måste klienten kunna interagera med resursägarens användaragent (som i de flesta fall är en webbläsare) och är därför vanligtvis lämpad för en webbapplikation. Nedanstående diagram är ett fågelperspektiv av hur slutanvändaren (eller resursägaren) använder klientapplikationen (webbserverbaserad applikation i det här fallet) för att autentisera och auktorisera med behörighetsservern för att få tillgång till de skyddade resurserna av resursservern.


Godkänn och auktorisera klienten

Klienten, på uppdrag av resursägaren, initierar flödet genom att omdirigera till godkännandepunktet med en response_type-parameter som koda, en klientidentifierare, som erhålls under klientregistrering, en omdirigeringsadress, en önskad räckvidd (valfritt) och en lokal stat (om någon). För att få en känsla för hur det verkligen fungerar, här är en skärmdump av hur en typisk förfrågan / svar skulle se ut:


Detta presenterar normalt resursägaren med ett webbgränssnitt där ägaren kan autentisera och kontrollera vilka rättigheter som klientens app kan använda på ägarens vägnar.


Om du antar att resursägaren ger tillgång till klienten omdirigerar auktorisationsservern användaragenten tillbaka till klienten med den omdirigeringsadress som tillhandahållits tidigare tillsammans med godkännandekoden som visas av svaret nedan.


Exchange Authorization Code for Tokens

Klienten då inlägg till en annan godkännandepunkt och skickar den behörighetskod som mottogs i det tidigare steget tillsammans med omdirigeringsadressen, dess klientidentifierare och hemliga, erhållna under klientregistreringen och en grant_type-parameter måste ställas in som Behörighetskod.


Servern validerar sedan behörighetskoden och verifierar att omadresseringsadressen är densamma som den var i det tidigare steget. Om det lyckas svarar servern tillbaka med en åtkomsttoken och eventuellt en uppdateringstoken.


Begär begränsade resurser med hjälp av tillåt Token

Klienten kan nu konsumera API: erna som tillhandahålls av implementeringen och kan fråga resursservern för en begränsad resurs genom att passera åtkomsttoken i auktoriseringsrubriken för begäran. Ett urval av CURL-förfrågan till Googles bloggers API för att få en blogg, med angivande av dess identifierare, skulle se ut så här:

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

Observera att vi har lagt till åtkomsttoken som en auktoriseringsrubrik i förfrågan och också undvikit token genom att inkludera den i enkla citat, eftersom token kan innehålla specialtecken. Tänk på att flykting åtkomsttoken endast krävs när du använder curl. Det resulterar i att skicka följande förfrågan:


Resursservern verifierar sedan de godkända godkännandena (åtkomsttoken) och, om den lyckas, svarar med den begärda informationen.


Dessa exempel är courtesy of OAuth2.0 Playground och är typiska för hur Google implementerar spec. Skillnader kan observeras när man försöker samma flöde med andra leverantörer (som Facebook eller Salesforce) och det är här där driftskompatibilitetsproblemen kryper in, vilket vi diskuterar lite senare.

Uppfriskande åtkomsttoken

Även om det inte är mandat av specen, men vanligtvis är åtkomstbiten kortvariga och kommer med en utgångstid. Så när en åtkomsttoken är utgående skickar klienten uppdateringstecknet till auktorisationsservern tillsammans med dess klientidentifierare och hemlighet, och en grant_type-parameter som refresh_token.


Autorisationsservern svarar sedan med det nya värdet för åtkomsttoken.


Även om en mekanism existerar för att återkalla uppfriskningstoken utfärdat, men normalt lever uppfriskningstoken för alltid och måste skyddas och behandlas som ett hemligt värde.


Vad är fel med OAuth 2.0?

De bra sakerna

OAuth 2.0 är definitivt en förbättring jämfört med dess arcane föregångare. Instanser av utvecklingssamhället falter under genomförandet av signaturerna på 1,0 är inte okända. OAuth 2.0 ger också flera nya bidragstyper, som kan användas för att stödja många användningsfall som inbyggda applikationer, men USP av denna spec är dess enkelhet över den tidigare versionen.

De dåliga delarna

Det finns några lösa ändar i specifikationen, eftersom det inte korrekt definierar några nödvändiga komponenter eller lämnar dem upp till implementeringarna för att bestämma, till exempel:

Lösa ändar i OAuth 2.0-specifikationen kommer sannolikt att producera ett brett utbud av icke-driftskompatibla implementeringar.

  • interoperabilitet: Att lägga till för många tilläggspunkter i specifikationen resulterade i implementeringar som inte är kompatibla med varandra, det betyder att du inte kan hoppas att skriva en generisk kod som använder Endpoint Discovery att veta om slutpunkterna som tillhandahålls av de olika implementationerna och interagera med dem, snarare skulle du behöva skriva separata kodstycken för Facebook, Google, Salesforce och så vidare. Även specifikationen tillåter detta fel som en ansvarsfriskrivning.
  • Kortvariga Tokens: Specifikationen mandat inte livstid och omfattning av de utfärdade tokens. Genomförandet är gratis för att få ett token för evigt. Även om de flesta implementationerna ger oss kortvariga access tokens och en uppdateringstoken, som kan användas för att få en ny åtkomsttoken.
  • säkerhet: Specen "rekommenderar" användningen av SSL / TLS medan du skickar tokens i ren text över kabeln. Även om varje större genomförande har gjort det obligatoriskt att även ha säkra auktoriseringsändpunkter, kräver det att klienten måste ha en säker omdirigeringsadress, annars kommer det att vara alltför lätt för en angripare att avlyssna kommunikationen och dechiffrera tokens.

The Ugly Spat

Det tog IETF om 31 utkastsversioner och avskrivningen av huvudförfattaren / utvecklaren Eran Hammer från utskottet för att slutligen publicera specifikationen. Eran sparkade en kontrovers genom att ringa spec "ett dåligt protokoll och ett fall av död med tusen nedskärningar". Enligt honom var användningen av bärare tokens (sänder tokens över SSL utan att underteckna dem eller någon annan verifikation) över användaren av signaturer (eller MAC-Tokens) som användes i OAuth 1.0 för att signera begäran, ett dåligt drag och ett resultat av fördelning av intressen mellan webben och företagsamhällen.


Slutliga anmärkningar

Specen lämnar säkert många tilläggspunkter i öppen, vilket resulterar i implementeringar som introducerar sina egna parametrar, utöver vad specifikationen redan definierar och ser till att implementeringar från olika leverantörer inte kan interoperera med varandra. Men med OAuths popularitet och adoptionshastighet, med varje stor spelare i staden (Google, Twitter, Facebook, Salesforce, Foursquare, Github etc.) implementerar och anpassar det som passar dem, är OAuth långt ifrån misslyckat . Faktum är att varje webbapplikation som planerar att avslöja sina API: er för andra webbapplikationer måste stödja någon form av autentisering och auktorisering och OAuth passar räkningen här.

För vidare läsning

  • OAuth och vägen till helvetet
  • OAuth - En introduktion
  • RFC 5849 - OAuth1.0 spec
  • RFC 6749 - OAuth2.0 spec