Om maar eens met een auto-analogie te komen: wanneer je (iets te onbetrouwbare)
neefje iets uit de kofferbak van je auto moet halen, kan het een onveilig
gevoel geven om hem direct de sleutel van je nieuwe A4 te overhandigen.
Hij kan immers met die sleutel de auto starten, wegrijden en je no-claim
om zeep helpen. En doet hij het niet nu, dan kan hij de sleutel kopiëren
en het morgen proberen. Zou het niet mooi zijn om een sleutel te geven
die alleen werkt op de kofferbak?
Zelfde geldt voor 3rd parties die bij jouw data willen. Wanneer een applicatie
alleen een lijstje met de huizen die jij bewaard op funda wil tonen, waarom
zou je dan je gebruikersnaam en wachtwoord moeten geven? Daar kan de applicatie
immers álles mee. Daarom: OAuth.
An open protocol to allow secure API authorization in a simple and standard method from desktop and web applications. "If you're storing protected data on your users' behalf, they shouldn't be spreading their passwords around the web to get access to it. Use OAuth to give your users access to their data while protecting their account credentials."
OAuth is dus een open protocol waarmee je 3rd parties toegang kan geven
tot data van je gebruikers, zonder dat de gebruiker zijn wachtwoord met
de 3rd party hoeft te delen.
Werking Met in de hoofdrollen '3rd party', 'Leverancier' en
onze gebruiker 'jan@funda.nl'.
- 3rd party: "Hallo Leverancier. Ik wil gegevens van een gebruiker
hebben. Hier is mijn door jullie gegeven key!"
- Leverancier: "Hallo 3rd party. Hier is een token om aan je gebruiker
te geven!"
- 3rd party: "Gebruiker: ga naar de website van Leverancier met deze
token."
- mailto:jan@funda.nl:
"Hallo Leverancier. Ik heb hier een token, en mijn gebruikersgegevens!"
- Leverancier: "Prima in orde. Zeg maar tegen de 3rd party dat hij
terug mag komen."
- 3rd party: "Ik heb hier een token, kan ik hier iets mee?"
- Leverancier: "Ja, die token is zojuist gevalideerd. Hier is een
nieuwe permanente token waarmee je voortaan alle gegevens van je gebruiker
kan opvragen."
De 3rd party heeft nu een gevalideerde token en kan deze gebruiken om
te authenticeren. Zoals je zag in bovenstaande lijst hoeft de gebruiker
nooit aan de 3rd party bekend te maken wie hij is. Met de token kunnen
gegevens opgevraagd worden:
- 3rd party: "Ik wil graag de bewaarde woningen ophalen die bij deze
token horen."
En voor de gebruiker? Ik heb een voorbeeld client voor Twitter gepakt, en de URLs veranderd
naar URLs van mezelf. Bij OAuth zijn er 3 type URLs te onderscheiden:
request_token: Opvragen van een request token
authenticate: Authenticatie URL voor de gebruiker, waarbij je het token
meegeeft in de URL
access_token: Inwissel van request token -> access token, om echt data
op te halen
Request token Request token is aangevraagd, en de applicatie kondigt aan dat er authenticatie
gaat plaatsvinden:
Authenticatie De gebruiker authenticeert zich op de normale website van de leverancier.
Je ziet de token die zonet gegenereert is:
Uitwisselen request token -> access token In dit geval moet er handmatig worden aangegeven (want Windows applicatie;
in een webapplicatie stuur je de gebruiker door naar de 'authenticate'
URL met als extra param 'oauth_callback') dat er ingelogd is:
Opvragen van data met de access token Elk request dat geauthoriseerd moet worden kan nu gedaan worden. Zie hier
de response van een beveiligd contract:
Implementatie Om je eigen data beschikbaar te maken via OAuth kan je helemaal zelf een
provider schrijven middels de RFC, of dit doen met behulp van een pakket
als DevDefined.OAuth (open
source). Een implementatie op basis van dit framework bestaat uit 4 onderdelen:
1. Provider: set van classes die globaal alle requests doorlussen naar
je implementaties.
2. Inspectors: validatie van berichten. Bijvoorbeeld op timestamp, gebruikte
hashing of encryptiemethodes.
3. Consumer store: mapping tussen je DAO en DevDefined.
4. Token store: mapping tussen je DAO en DevDefined.
N.B. De source staat ook onderaan in ZIP formaat.
Consumer store Wanneer je geen RSA encryptie gebruikt, is deze store behoorlijk simpel,
en bestaat uit 2 methodes:
Token store Hier een in-memory store. Je kunt deze makkelijk vertalen naar een met
een database backend.
WCF service We maken gebruik van een WCF service voor onze OAuth methodes. Eerst leggen
we een referentie naar de 'provider':
request_token In je WCF service:
access_token In je WCF service:
authorize Om je request token in te wisselen kan je elke login pagina op je website
gebruiken. In het standaard ASP.NET MVC 2 project in de AccountController.cs.
Verander de 'Logon' actie in iets als: