diff --git a/static/img/access_token.png b/static/img/access_token.png new file mode 100644 index 0000000..fc9536b Binary files /dev/null and b/static/img/access_token.png differ diff --git a/static/img/auth_access_token.png b/static/img/auth_access_token.png new file mode 100644 index 0000000..225c30e Binary files /dev/null and b/static/img/auth_access_token.png differ diff --git a/static/img/http_auth.png b/static/img/http_auth.png new file mode 100644 index 0000000..39dce58 Binary files /dev/null and b/static/img/http_auth.png differ diff --git a/static/img/oauth.png b/static/img/oauth.png new file mode 100644 index 0000000..41a8d35 Binary files /dev/null and b/static/img/oauth.png differ diff --git a/static/img/oauth_authorization_code.png b/static/img/oauth_authorization_code.png new file mode 100644 index 0000000..91e8988 Binary files /dev/null and b/static/img/oauth_authorization_code.png differ diff --git a/static/img/oauth_call_api.png b/static/img/oauth_call_api.png new file mode 100644 index 0000000..fe4fc01 Binary files /dev/null and b/static/img/oauth_call_api.png differ diff --git a/static/img/oauth_exchange_auth_code.png b/static/img/oauth_exchange_auth_code.png new file mode 100644 index 0000000..db59f57 Binary files /dev/null and b/static/img/oauth_exchange_auth_code.png differ diff --git a/static/img/oauth_facebook.png b/static/img/oauth_facebook.png new file mode 100644 index 0000000..839d710 Binary files /dev/null and b/static/img/oauth_facebook.png differ diff --git a/static/img/oauth_google_call_api.png b/static/img/oauth_google_call_api.png new file mode 100644 index 0000000..e5e3fbd Binary files /dev/null and b/static/img/oauth_google_call_api.png differ diff --git a/static/img/oauth_google_refresh.png b/static/img/oauth_google_refresh.png new file mode 100644 index 0000000..bc3724b Binary files /dev/null and b/static/img/oauth_google_refresh.png differ diff --git a/static/img/oauth_refresh_token.png b/static/img/oauth_refresh_token.png new file mode 100644 index 0000000..53155c4 Binary files /dev/null and b/static/img/oauth_refresh_token.png differ diff --git a/static/img/oauth_register.png b/static/img/oauth_register.png index e9d66ae..d4618ff 100644 Binary files a/static/img/oauth_register.png and b/static/img/oauth_register.png differ diff --git a/static/img/oauth_set_grant_type.png b/static/img/oauth_set_grant_type.png new file mode 100644 index 0000000..b6be121 Binary files /dev/null and b/static/img/oauth_set_grant_type.png differ diff --git a/static/img/webapp1.png b/static/img/webapp1.png new file mode 100644 index 0000000..0a7e675 Binary files /dev/null and b/static/img/webapp1.png differ diff --git a/static/img/webapp2.png b/static/img/webapp2.png new file mode 100644 index 0000000..6811191 Binary files /dev/null and b/static/img/webapp2.png differ diff --git a/templates/base.html b/templates/base.html index 1299d51..12a53d5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -16,6 +16,7 @@

Ingelogd als {{ user }}.

+
Security 1
+
Security 2
+ + Moeilijkheidsgraad:
-

Elke OAuth server heeft twee endpoints (lees: URL's): de autorisatie endpoint en de token endpoint. Hieronder zie je de endpoints van een aantal bekende servers:

+

Elke OAuth server heeft twee endpoints (lees: URL's): de authorisatie endpoint en de token endpoint. Hieronder zie je de endpoints van een aantal bekende servers:

@@ -95,76 +127,146 @@
-

De autorisatie endpoint is de URL waar je de gebruiker heenstuurt om hem te laten inloggen op de website en om op 'Toestaan' te laten klikken. Deze site redirect daarna weer terug naar je eigen site / app met een speciale autorisatie code. De token endpoint is de OAuth API waar we al onze access tokens uit kunnen halen, maar dan hebben we wel eerst die autorisatie code nodig.

+

De authorisatie endpoint is de URL waar je de gebruiker heenstuurt om hem te laten inloggen op de website en om op 'Toestaan' te laten klikken. Deze site redirect daarna weer terug naar je eigen site / app met een speciale authorisatie code. De token endpoint is de OAuth API waar we al onze access tokens uit kunnen halen, maar dan hebben we wel eerst die authorisatie code nodig.

Om te authoriseren hebben we de volgende URL parameters nodig: (documentatie)

-

Een voorbeeld van een autorisatie URL is: http://sec.aii.avans.nl/o/authorize/?client_id=(CLIENT_ID)&response_type=code

+

Voor deze site is de authorisatie URL:
+ http://sec1.aii.avans.nl/o/authorize/?client_id=(CLIENT_ID)&response_type=token

- Autoriseer met je eigen client id. Welke autorisatie code heb je gekregen? + Authoriseer met je eigen client id. Welke access token heb je gekregen?
5 punten
- +
-

Access tokens in zicht

+
+ Hoeveel seconden is deze token code geldig? +
5 punten
+ +
+ +

De access token kan je nu gebruiken om een request te doen naar /api/hello. De token geef je mee door de volgende HTTP header mee te sturen:

+ + Authorization: Bearer nW8JkemabiKpxvD1Yen3FCcWM3k7vr + +

Uiteraard moet je je eigen access token dan gebruiken. Er zijn vele tools waarmee je HTTP requests mee kan maken met je eigen headers en data. In de screenshots gebruiken we Postman.

+ + + +
+ Wat is de geheime code die gestuurd wordt als je de API aanroept? +
10 punten
+ +
+ + +

Web applicaties

-

Ok, we hebben nu een autorisatie code. Met die code heb je nu een bewijsje dat de gebruiker recentelijk jouw client heeft geautoriseerd. Maar na dat alles hebben we nog steeds niet die albelangrijke access tokens die ons toegang geven tot de API. Om daar aan te komen moeten we onze autorisatie code inwisselen bij de token endpoint voor een refresh token en een access token.

+

Wat doen we als de token verloopt en je nog steeds de API wil gebruiken? Je kan natuurlijk de gebruiker opnieuw naar de authorisatie URL sturen voor een nieuwe access token. Maar als jouw web applicatie dagelijks de gebruiker meerdere keren per dag redirect om op 'Geef toestemming' te klikken wordt die daar helemaal gek van.

-

Dit lijkt allemaal nodeloos complex, waarom geeft OAuth nadat de gebruiker zijn zege heeft gegevens ons niet meteen een refresh_token en een access_token? Waarom moet dat nou weer via een aparte 'autorisatie code'? De reden hiervoor is is dat OAuth ontworpen is rond het principe dat webapplicatie's access_token moeten kunnen krijgen, zonder dat de gebruiker die te zien krijgt. De gebruiker kan niet zelf nieuwe access tokens ophalen omdat hij niet de client_secret heeft.

+

OAuth heeft hier de zogenaamde refresh tokens voor verzonnen. Dit is een uitgebreidere manier om access tokens te krijgen en is meer geschikt voor webapplicaties. We moeten wel helemaal terug naar het begin en alle stappen net iets anders doen:

-

Om de access_token en de refresh_token te krijgen moeten we POST requests versturen naar de token endpoint. Testen met POST requests is het handigst om met een tool te doen. In de screenshots maken we gebruik van Postman. +

    +
  1. Ga naar /o/applications/ en verander jouw applicatie zodat deze nu als Authorization grant type de waarde Authorization code heeft.
    + +
  2. - We moeten de volgende parameters meesturen: (documentatie) +
  3. Ga opnieuw naar dezelfde authorisatie URL van vorige keer, maar nu met response_type=code in plaats van response_type=token
  4. + +
  5. Je wordt nu teruggestuurd met een zogenaamde authorisatie code
  6. +
+ +
+ Welke authorisatie code heb je gekregen? +
5 punten
+ +
+ + + + +

Deze authorisatie code is nog geen access token op zich, maar kan een webapplicatie wel inwisselen voor een access token. Dit doet het door een POST request te doen naar de token endpoint. We moeten daarvoor de volgende parameters meesturen:

- ... Wissel om voor een access token (binnen 60 sec!) ... +

Doe er niet te lang over, authorisatie codes verlopen vaak al na enkele minuten. Als je het goed doet krijg je een response met daarin de refresh_token (en een gratis access_token!). Als je een invalid_grant error krijgt betekent dat dat jouw code verlopen is en dat je een nieuwe moet aanvragen. Als je een invalid_client error krijgt moet je goed controleren of je redirect_uri, client_id en client_secret allemaal goed staan ingesteld.

- Welke access_token heb je gekregen? 2 punten - En welke refresh_token? 2 punten + - Gebruik de access_token om de API /api/hello aan te roepen. +
+ Welke refresh token heb je gekregen? +
5 punten
+ +
- Welke geheime code is er op de API te downloaden? 5 punten + +

Gefeliciteerd, je hebt nu een refresh token! Een oneindige bron van nieuwe access tokens. Je vraagt je bijna af waarom OAuth uberhaupt de moeite doet om een authorisatie code te hebben als die toch maar zo kort gebruikt wordt. De reden hiervoor is dat dit mechanisme ervoor zorgt dat alleen de webapplicatie de refresh en access tokens kan ophalen, en niet de gebruiker. Zonder de juiste client_secret kan de gebruiker namelijk helemaal niets met de authorisatie code.

- ... Refresh ... +

We schakelen voor het gebruik van de refresh token even over naar een hele andere site

Google

- Calendar API: https://www.googleapis.com/calendar/v3/calendars/secavans@gmail.com/events - Refresh token: 1/Capy9gSUUiS3HEWDCrc8AQjSoBg3uPz79JtOvSVw5kk +

Bij Google hebben we een OAuth client geregistreerd en de volgende gegevens gekregen:

- ... Wat is de geheime code? 20 punten + + Client id: 353772107173-61n4eq2n32u1idevgh5uochsehd19uf4.apps.googleusercontent.com
+ Client secret: O4Q1RRRH81XdPe5iTHvlpkuT
+ Refresh token: 1/Capy9gSUUiS3HEWDCrc8AQjSoBg3uPz79JtOvSVw5kk
+

Met deze gegevens kunnen we weer een POST doen naar de token endpoint (voor Google: https://accounts.google.com/o/oauth2/token) om een access token te genereren. Dit keer hoeven we geen redirect_uri mee te sturen en moeten we de grant_type parameter op 'refresh_token' zetten:

- Gebruik je eigen Google account om iets uit een Google API te halen. Denk bijvoorbeeld aan je laatst ontvangen gmail mailtje, een overzicht van bestanden op Google Drive, + - Beschrijf alle GET en POST requests die je hebt gedaan om tot de . +

Gebruik de access token die je krijgt om een API call te doen naar https://www.googleapis.com/calendar/v3/calendars/secavans@gmail.com/events. Vergeet niet weer de juiste Authorization header te gebruiken om je access token in te zetten! Als je het goed doet krijg je alle events uit onze Google Calender te zien in JSON formaat.

-

Eigen API

+ - Maak een kleine webapplicatie waarmee je alle evenementen op je Google calendar kan inzien. Je mag hierbij gebruik maken van een framework. - 30 punten +
+ Wat is de code die in de Geheime afspraak staat? +
10 punten
+ +
+

Genoeg tutorial, tijd voor het echte werk! We gaan handmatig het hele OAuth proces doorlopen voor een Google API. Dat mag weer de Google Calendar API zijn maar dan voor je eigen Google Calendar. Maar je mag ook een andere API kiezen zoals Gmail of Google Drive.

+

Details over Google OAuth 2.0 kan je vinden op deze pagina. Let op dat je API's eerst moet activeren in de Developer Console. Dat is ook de plek waar je je Client ID en Client secret krijgt, die maak je aan onder APIs & auth > Credentials. Maak een nieuwe client aan voor een standaard web applicatie.

+

Gebruik de authorisatie URL zoals die hier staat gedocumenteerd.

+
+ Beschrijf de HTTP requests die je hebt gemaakt om de token te krijgen en de API te gebruiken (en ook de uitkomst van die requests). Gevoelige data mag je met ***** censureren. +
15 punten
+ +
+ Beschrijf alle GET en POST requests die je hebt gedaan om tot de . + +

Mini webapp

+ +

Maak een kleine webapplicatie in PHP waarmee je de requests uit de vorige opdracht automatisch uitvoert (je mag ook een OAuth framework gebruiken)

+ + + +
+ Plak de broncode van je webapplicatie in het tekstvak +
20 punten
+ +
{% endblock %} diff --git a/views.py b/views.py index 7f8d683..a3c20f1 100644 --- a/views.py +++ b/views.py @@ -86,7 +86,6 @@ def save_data(data, user): answer.save() def home(request, url): - #return HttpResponse('home2') if not request.user.is_authenticated(): return avans_login(request)