Document toolboxDocument toolbox

OAuth 2.0 Client authenticatie

De VIP REST API gebruikt het OAuth 2.0 protocol voor autorisatie en maakt hiervoor gebruik van het Vlaams Toegangsbeheer.

Meer informatie: https://authenticatie.vlaanderen.be/docs/beveiligen-van-toepassingen/integratie-methoden/oauth/.

Client Authenticatie via JWT Token

Voor de authenticatie van de OAuth client bij het Token endpoint worden verschillende mogelijkheden aangeboden, echter de VIP API vereist client authenticatie via een JWT token. Dit hoeft geen VO-DCB certificaat te zijn, een asymmetrisch sleutelpaar volstaat.

Meer informatie is te vinden op de volgende pagina: https://authenticatie.vlaanderen.be/docs/beveiligen-van-toepassingen/integratie-methoden/oauth/technische-info/client-authenticatie/#client-authenticatie-via-een-jwt-token .

Genereren van een JSON Web Token

Stap 1: genereren JSON Web Key

Om onze klanten te helpen hebben we een .NET Core console tool voorzien die een geldige JSON Web Key genereert met een private -en publieke sleutel op een lokale machine. Je kan een nieuwe JSON Web Key maken met de tool of deze genereren op basis van een bestaand (X509) certificaat.

Hieronder kan je de nodige stappen vinden voor Microsoft Windows en Linux.



Microsoft Windows

Linux



Microsoft Windows

Linux

Asymmetrisch sleutelpaar

  1. Installeer .NET Core 3.1 Runtime.

  2. Download het programma

    (ZIP-file).

  3. Unzip het programma in een folder.

  4. Voer het volgende commando uit in een console in de folder:

    dotnet GenerateJsonWebKey.dll

    Dit zal een publieke -en private sleutel genereren.

  5. Geef de publieke sleutel door aan onze helpdesk.

  6. Gebruik de private sleutel om de JWT voor de request te genereren.

  1. Installeer the dot-net-runtime on Linux.

  2. Download the program

    (ZIP-file).

  3. Unzip het programma in een folder.

  4. Voer het volgende commando uit in een console in de folder:

    ~$ dotnet GenerateJsonWebKey.dll

    Dit zal een publieke -en private sleutel genereren.

  5. Geef de publieke sleutel door aan onze helpdesk.

  6. Gebruik de private sleutel om de JWT voor de request te genereren.

Gegenereerde sleutel van een .p12 of .pfx bestand van een (X509) certificaat

Je kan een JSON Web Key genereren van een bestaand certificaat, we accepteren .p12 of .pfx extensies, die bestanden kan je maken met OpenSSL.

  1. Plaats je .p12 of .pfx bestand in de folder en voer het volgende commando uit in een console:

    dotnet GenerateJsonWebKey.dll -c MijnPfxBestand.pfx

    Dit zal een publieke -en private sleutel genereren.

  2. Geef de publieke sleutel door aan onze helpdesk.

  3. Gebruik de private sleutel om de JWT voor de request te genereren.

Je kan een JSON Web Key genereren van een bestaand certificaat, we accepteren .p12 of .pfx extensies, die bestanden kan je maken met OpenSSL.

  1. Plaats je .p12 of .pfx bestand in de folder en voer het volgende commando uit in een console:

    ~$ dotnet GenerateJsonWebKey.dll -c MijnPfxBestand.pfx

    Dit zal een publieke -en private sleutel genereren.

  2. Geef de publieke sleutel door aan onze helpdesk.

  3. Gebruik de private sleutel om de JWT voor de request te genereren.

Stap 2: maak een client assertion

Volg de stappen in de documentatie van ACM-IDM: https://authenticatie.vlaanderen.be/docs/beveiligen-van-api/oauth-rest/rest-server2server/aanvraag-access-token/#client-authenticatie-via-een-jwt-token.
De JWT in de client_assertion dient uiteraard gesigned te zijn met één van de keys die voor die Client geregistreerd staan op de Authorization Server.

Om het proces te testen en beter te begrijpen kan je op een eenvoudige manier een signed JWT maken via http://jwt.io :

  • Kies het algoritme, b.v. RS512.

  • Plak de claims in de header en payload + publieke/private sleutel in de signature.
    De output die je krijgt is de client_assertion dat gebruikt kan worden in de body van de access token request.

Belangrijk: als je een geëncodeerde private sleutel hebt moet je die eerst decoderen met OpenSSL of een andere tool.

Voorbeelden:

  • Geëncodeerde private sleutel (.pem):  -----BEGIN ENCRYPTED PRIVATE KEY----- ... -----END ENCRYPTED PRIVATE KEY-----

  • Gedecodeerde private sleutel: -----BEGIN RSA PRIVATE KEY----- ... -----END RSA PRIVATE KEY-----


Code voorbeelden

import jwt, requests, uuid with open('client1.digitaalvlaanderen.be.key') as pk_fp: priv_key = pk_fp.read() payload={ # iss, sub: Unieke identificatiecode: 2f03e9d4-ebe7-4a07-b93f-8c3f88bd6098 "sub": "2f03e9d4-ebe7-4a07-b93f-8c3f88bd6098", "iss": "2f03e9d4-ebe7-4a07-b93f-8c3f88bd6098", "iat": "1552909601", "exp": "1662909700", "jti": str(uuid.uuid4()), "aud": "https://authenticatie-ti.vlaanderen.be/op" } encoded = jwt.encode(payload, priv_key, algorithm='RS512', headers={'kid': 'B6D026345034791D3CC53DAF3AC7AE6D9C6050F3'}) request_data = { 'grant_type' : 'client_credentials', 'scope' : 'vstg_informatieaanvrager', 'client_assertion' : encoded, 'client_assertion_type' : 'urn:ietf:params:oauth:client-assertion-type:jwt-bearer' } resp=requests.post('https://authenticatie-ti.vlaanderen.be/op/v1/token', data=request_data) print(resp.json()) ''' access token, eg. { 'access_token': 'b5dfT7wC0jDFYOY7wH18ZA==', 'scope': 'vstg_informatieaanvrager', 'expires_in': 57086, 'token_type': 'Bearer' }