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: oAuth 2.0.
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: Client authenticatie .
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 | |
---|---|---|
Asymmetrisch sleutelpaar |
|
|
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.
| Je kan een JSON Web Key genereren van een bestaand certificaat, we accepteren .p12 of .pfx extensies, die bestanden kan je maken met OpenSSL.
|
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'
} |
Â
Â