Claims Management
Volgende, we moeten goed nadenken over claims. Een claim is simpelweg het naam/waarde paar dat in onze Access en ID Tokens zit. Bijvoorbeeld, je zou een user_id of email claim kunnen hebben zodat downstream applicaties deze kunnen gebruiken om profielen aan te maken of beslissingen te nemen. Het verwarrende is dat de OAuth Core specificatie het concept van claims niet introduceert of zelfs maar het woord claim bevat. Dit is handig omdat we kunnen definiëren wat we nodig hebben. Helaas is de uitdaging dat mensen ze zullen definiëren zoals zij dat willen. De JWT specificatie (RFC 7519) introduceert het concept en definieert een basis structuur, maar geeft nog steeds geen conventies voor namen, structuren, etc.
Het gebruik van OpenID Connect beschermt ons al behoorlijk. Het definieert een eenvoudige set van claims voor gebruikersdetails zoals naam, adres, en dergelijke. Als we alleen die gebruiken en de toegang beperken volgens de juiste scopes, weet de gebruiker welke informatie hij deelt en weten applicaties hoe ze die moeten gebruiken.
Als alternatief, als we extra claims toevoegen, is het natuurlijke verlangen om een gebruiker-unieke identifier te hebben. Als we daar goed over nadenken, gebruiken we een versluierde primaire sleutel die buiten ons systeem geen betekenis heeft. Als we niet oppassen, kan dat een klantidentificatie zijn, een personeelsnummer of zelfs een sofinummer. Dit is dezelfde situatie waarin Facebook worstelt met de gevolgen van het delen van te veel informatie over het netwerk van een gebruiker via hun API.
We moeten weloverwogen zijn en nadenken over de gevolgen van de informatie die we in onze tokens stoppen. We moeten nooit gegevens opnemen “voor het geval dat” en in plaats daarvan wachten op specifieke use cases die we kiezen om te ondersteunen. Al het andere is op zijn best riskant en op zijn slechtst onverantwoord.
Grant Types – When and Why
Terwijl ik meteen in scopes en claims sprong, heeft de andere meest gemaakte fout te maken met de specifieke OAuth grant types of flows. De vier typen – Authorization Code, Implicit, Resource Owner Password, en Client Credential – definiëren hoe een applicatie tokens kan ophalen van uw OAuth server en worden gebruikt in verschillende use cases.
Authorization Code
De Authorization Code flow is standaard de meest krachtige en meest veilige. Wanneer de applicatie de gebruiker doorverwijst naar de Identity Provider om te authenticeren, geeft de IdP een kortstondige, eenmalige autorisatiecode terug. De applicatie gebruikt de autorisatie code om de Access Token op te halen.
Het belangrijke deel is tweeledig: Ten eerste, tegen de tijd dat de gebruiker de autorisatiecode ziet, is deze al verbruikt en kan dus niet opnieuw worden gebruikt. Ten tweede, het Toegangstoken wordt bewaard door de applicatie in de backend. Ervan uitgaande dat de applicatie veilig is gebouwd, moet een kwaadwillende gebruiker een andere manier vinden om deze aan te vallen.
Helaas werkt dit niet voor client-side applicaties, zoals veel Javascript apps of de meeste mobiele apps, omdat de applicatie zelf kan worden aangevallen of gedecompileerd voor gevoelige informatie. Daarom hebben we een andere aanpak nodig.
Implicit
De Implicit flow is speciaal ontworpen voor mobiele apps of client side Javascript apps waar embedded credentials gecompromitteerd zouden kunnen worden. Het mechanisme is eenvoudig: de applicatie stuurt de gebruiker door naar de Identity Provider om zich te authenticeren, de IdP stuurt token(s) terug, en de applicatie gebruikt het volgens de scopes die het heeft.
Omdat het zeer waarschijnlijk is dat de gebruiker met de token(s) kan interageren, is het belangrijk dat onze use cases dat weerspiegelen. Als we een bankieren app hebben, kan het toestaan van de send_wire_transfers_to_russia scope een slecht idee zijn, tenzij we extra factoren in ons authenticatie proces hebben ingebakken om te valideren dat de juiste gebruiker het gebruikt. De volgende keer dat je je telefoon verliest, zul je dat waarderen.
Daarom wordt dit vaak gebruikt voor OpenID Connect scenario’s waar een gebruiker vertrouwde profiel informatie wil verstrekken aan een derde partij, maar niet noodzakelijkerwijs toegang of permissies tot andere systemen. Omdat de onderliggende concepten hetzelfde zijn en de implementatie erg op elkaar lijkt, levert dit het meeste voordeel op voor dezelfde inspanning.
Resource Owner Password
Vergeleken met de vorige grant types, maakt Resource Owner Password me nerveus. Bij zowel de Authorization Code als de Implicit flows stuurt de applicatie de gebruiker door naar de Identity Provider om zijn gebruikersnaam en wachtwoord op te geven. Als gevolg daarvan ziet de applicatie nooit hun credentials. Met de Resource Owner Password flow accepteert de applicatie zelf de inloggegevens en verstuurt deze namens de gebruiker.
Als de applicatie kwaadaardig of zelfs maar slecht ontwikkeld is, zou deze de inloggegevens kunnen opslaan en de informatie van de gebruiker in gevaar kunnen brengen. Daarom zou u dit alleen moeten gebruiken als u applicaties bouwt om uw gebruikers te laten communiceren met uw legacy-systemen. Een bank kan dit bijvoorbeeld implementeren voor een intern werknemersportaal.
Maar onthoud: In wezen train je gebruikers om hun credentials in applicaties te stoppen die ze misschien niet vertrouwen, wat op zijn best een slechte gewoonte is en altijd een veiligheidsrisico.
Client Credential
Het type Client Credential is uitsluitend ontworpen voor backend server to server operaties. Zie het als de gebruikersnaam en het wachtwoord van een server. Conceptueel is het niet ver van hoe uw applicatie verbinding maakt met andere backend systemen zoals uw database of Twilio. Het voordeel is dat je OAuth provider configuratie informatie of andere details in het token zelf kan teruggeven.
Ten slotte, omdat er geen gebruiker bij betrokken is, ondersteunt het OpenID Connect niet.
Insluitend
Terwijl deze hele post over OAuth ging, is het je waarschijnlijk opgevallen dat ik geen code heb toegevoegd. De reden daarvoor is eenvoudig: De ontwerpbeslissingen zijn nog steeds belangrijker.
Als je scopes te breed zijn of je claims gevoelige informatie bevatten of je de verkeerde flow voor de omgeving implementeert, zullen de beste bibliotheken ter wereld je niet beschermen. De informatie van uw gebruikers zal worden gecompromitteerd, uw toepassingen zullen kwetsbaar zijn, en uw bedrijf zal de gevolgen ondervinden. Maar als u begrijpt hoe uw software wordt gebruikt en wat uw gebruikers willen bereiken, wordt uw software beter en veiliger, en kunt u de “Het spijt ons…” e-mails aan uw klanten beperken.
Voor verder lezen
Van hieruit kunnen we verder gaan met de protocollen, individuele bibliotheken, of geweldige boeken over het onderwerp. Als je wilt begrijpen hoe de individuele RFC’s in elkaar steken, kijk dan eens naar Aaron Parecki’s boek OAuth2.0 Simplified en zijn bijbehorende Map of OAuth 2.0 Specs. Het is mijn favoriete cheatsheet met links naar de belangrijkste specificaties en welke specificaties wat dekken. Al het bovenstaande inspireerde mijn gids voor Aanbevolen Praktijken voor API-toegangsbeheer met details over goed ontwerp en ontwikkelingsprincipes voor OAuth-clients, autorisatieservers, API-gateways en uw applicaties.