Access Token verkrijgen onder de knie: De authorization code flow

Dit blogbericht maakt deel uit van een reeks. In dit bericht belichten we de authorization code flow. Bekijk de andere berichten over de andere autorisatiestromen:

Een zeer belangrijk onderdeel bij het gebruik van bepaalde endpoints is het authenticatiegedeelte. Wanneer je de Microsoft 365-omgeving gebruikt, worden voortdurend allerlei endpoints aangesproken. Je hoeft je niet veel zorgen te maken over de authenticatie, omdat dit voor je wordt gedaan. Je logt in en een id-token of access token wordt opgehaald en gebruikt gedurende je sessie in Microsoft 365. Wanneer het access token na 1 uur verloopt, wordt op basis van een refresh token een nieuw token opgehaald, maar hier ziet de gebruiker niets van omdat het voor je wordt gedaan.

Wanneer je echter zelf applicaties begint te bouwen, moet je de zaken zelf in handen nemen en bij voorkeur op de veiligste mogelijke manier. In deze blogreeks bespreek ik de meest gebruikte authenticatiemethoden.

Eerst dit

Bij het gebruik van de soorten autorisatiestromen authenticeer je niet met een gebruiker zoals je zou doen bij het gebruik van het Microsoft 365-platform. Je gebruikt een app waarvoor je de benodigde machtigingen definieert die kunnen worden gebruikt bij deze app. Op deze manier isoleer je de beveiliging tot alleen de noodzakelijke rechten waarvoor de app zal worden gebruikt. Hoe maken we zo’n app en voorzien we deze van de benodigde machtigingen?

Ga naar https://portal.azure.com en navigeer naar Microsoft Entra ID.

Navigeer van daaruit naar App registrations.

En klik op New registration.

Geef vervolgens je app-registratie een naam en klik op Register.

Tot slot kun je je applicatie de benodigde machtigingen geven door op API permissions te klikken en ze toe te voegen.

Authorization code flow

De Authorization code flow is een 2-staps stroom waarbij je 2 endpoints moet aanroepen. Eerst moet je het authorize-endpoint aanroepen met een GET-methode, van waaruit je wordt doorgestuurd naar een vooraf gedefinieerde redirect-URL die je een code geeft. Met deze code kun je een tweede endpoint aanroepen, het token-endpoint met een POST-methode, dat je het access token verstrekt.

Je app moet eerst een vooraf gedefinieerde redirect-URL hebben. Deze URL wordt gebruikt om de code naar die URL te sturen zodat je applicatie deze code kan gebruiken om een access token te verkrijgen.

Ga naar je Entra App-registratie en klik op Authentication en vervolgens op Add a platform.

Je zult zien dat er een paneel aan de rechterkant van je scherm verschijnt. Klik op Web.

Geef de redirect-URL op waarnaar je code moet worden gestuurd. Dit is doorgaans een URL van je applicatie, maar voor dit blogbericht gebruik ik https://localhost. Klik vervolgens op Configure.

Vervolgens kunnen we een GET-verzoek doen naar het authorize-endpoint waarvoor we de volgende waarden nodig hebben:

  • client_id: De id van je client. Deze is te vinden op het startscherm van je app-registratie.

  • response_type: code

  • redirect_uri: Dit moet overeenkomen met de redirect-URL die we hebben opgegeven in de autorisatiesectie. In dit voorbeeld moet dit https://localhost zijn.

  • scope: Het bereik moet de resource-identifier zijn van de applicatie waartegen je je access token wilt gebruiken, aangevuld met .default. Voor Microsoft Graph zou dit bijvoorbeeld https://graph.microsoft.com/.default zijn. Als je ook een refresh token terug wilt ontvangen, moet je offline_access aan je bereik toevoegen. Bijvoorbeeld: https://graph.microsoft.com/.default offline_access.

  • state: De state is een tekenreekswaarde die ook wordt meegegeven met de code. Dit kan informatie zijn over van waaruit de gebruiker het authorize-endpoint heeft aangeroepen, bijvoorbeeld. In dit voorbeeld is het niet erg nuttig, dus we zetten het gewoon op ‘12345’.

Deze informatie wordt als querystring meegegeven bij het authorize-endpoint. Het kan er bijvoorbeeld zo uitzien:

   https://login.microsoftonline.com/[YOUR_TENANT_ID]/oauth2/v2.0/authorize?client_id=[YOUR_CLIENT_ID]&response_type=code&redirect_uri=https://localhost&scope=https://graph.microsoft.com/.default&state=12345

Je kunt deze URL in je browser invoeren, waarna de gebruiker een inlogscherm ziet waar hij zijn gebruikersnaam en wachtwoord moet invoeren. Vervolgens zie je een scherm dat je vraagt de benodigde machtigingen voor deze app-registratie te accepteren:

Nadat je op accept hebt geklikt, word je doorgestuurd naar je redirect-URL samen met de volgende querystring-parameters:

  • De code die nodig is voor de volgende stap
  • De state die je hebt meegegeven bij het authorize-endpoint
  • session_state: dit is een guid om de sessie van de gebruiker bij te houden

Laten we nu overgaan naar het 2e endpoint, het token-endpoint. Hiervoor heb je de volgende parameters nodig:

  • client_id: De id van je client
  • client_secret: Het client secret van je app-registratie. Dit is iets wat je kunt genereren in de sectie Certificates & secrets van je app-registratie in Azure.
  • grant_type: authorization_code
  • code: De code die je in de vorige stap hebt teruggekregen. Let op: je kunt deze code slechts één keer inwisselen!
  • redirect_uri: Dezelfde redirect_uri-parameter als in de vorige stap.
  • scope: Hetzelfde bereik als in de vorige stap.

Als alles goed gaat, krijg je een json terug met daarin je access token en refresh token (als het bereik is opgegeven met ‘offline_access’).