🔑 OAuth — Token ophalen

Haal een RS256-gesigneerd bearer token op. Vereist: een geldig mTLS-certificaat.

Overzicht 📜 mTLS 🔑 OAuth 👤 PRS 📑 NVI

OAuth Service — Overzicht

De OAuth-dienst is een op maat gemaakte OAuth 2.0 Authorization Service. Voor machine-to-machine communicatie gebruik je de client credentials-flow met mTLS-authenticatie (tls_client_auth). Het UZI-certificaat dient als authenticatiemiddel — er is geen client_id of client_secret nodig. Het URA-nummer wordt automatisch uit het certificaat gelezen. De service geeft RS256-gesigneerde JWT access tokens terug.

Stap-voor-stap: token ophalen

  1. 1

    UZI-certificaat gereedmaken

    Zorg dat je client-uzi-chain.crt en client-uzi.key beschikbaar zijn. Zie de mTLS-gids.

  2. 2

    Scope en target audience bepalen

    Je URA-nummer wordt automatisch uit het UZI-certificaat gelezen — er is geen client_id nodig. Geef met scope de gevraagde rechten op en met target_audience voor welke dienst het token bedoeld is.

  3. 3

    Token ophalen

    Stuur een POST-verzoek naar /oauth/token met grant_type=client_credentials. De mTLS-verbinding verzorgt de authenticatie — geen client_secret vereist.

  4. 4

    Token gebruiken

    Voeg het token toe als Authorization: Bearer <token> header bij verzoeken aan PRS en NVI.

Parameters: scope & target_audience

ParameterWaardeToelichting
scopeepd:readEnige geldige scope op dit moment
target_audiencehttps://nvi.proeftuin.gf.irealisatie.nlToken voor NVI
target_audiencehttps://pseudoniemendienst.proeftuin.gf.irealisatie.nlToken voor PRS

Vraag per dienst een apart token op — een token is gekoppeld aan ÊÊn target_audience.

Token ophalen

curl -s -X POST \
  --cert client-uzi-chain.crt \
  --key  client-uzi.key \
  -d "grant_type=client_credentials" \
  -d "scope=epd:read" \
  -d "target_audience=<audience>" \
  https://oauth.proeftuin.gf.irealisatie.nl/oauth/token \
  | python3 -m json.tool
[$status, $body] = curlRequest($certFile, $keyFile, 'https://oauth.proeftuin.gf.irealisatie.nl/oauth/token', [
    CURLOPT_POST       => true,
    CURLOPT_POSTFIELDS => http_build_query([
        'grant_type'      => 'client_credentials',
        'scope'           => 'epd:read',
        'target_audience' => '<audience>',
    ]),
    CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded'],
]);

$data  = json_decode($body, true);
$token = $data['access_token'];
import requests

session = requests.Session()
session.cert = ("client-uzi-chain.crt", "client-uzi.key")

resp = session.post(
    "https://oauth.proeftuin.gf.irealisatie.nl/oauth/token",
    data={
        "grant_type":      "client_credentials",
        "scope":           "epd:read",
        "target_audience": "<audience>",
    },
)
token = resp.json()["access_token"]
// Laad PKCS#12-bundle (client-uzi-chain.crt + client-uzi.key)
KeyStore keyStore = KeyStore.getInstance("PKCS12");
try (InputStream is = new FileInputStream("client.p12")) {
    keyStore.load(is, "geheimwachtwoord".toCharArray());
}

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmf.init(keyStore, "geheimwachtwoord".toCharArray());

SSLContext sslCtx = SSLContext.getInstance("TLS");
sslCtx.init(kmf.getKeyManagers(), null, null);

HttpClient client = HttpClient.newBuilder()
    .sslContext(sslCtx)
    .build();

HttpRequest request = HttpRequest.newBuilder()
    .uri(URI.create("https://oauth.proeftuin.gf.irealisatie.nl/oauth/token"))
    .header("Content-Type", "application/x-www-form-urlencoded")
    .POST(HttpRequest.BodyPublishers.ofString(
        "grant_type=client_credentials&scope=epd:read&target_audience=<audience>"))
    .build();
HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());

Response

{
    "token_type":     "Bearer",
    "access_token":  "eyJhbGciOiJSUzI1NiIsImtpZCI6Im9hdXRoLWlzc3Vlci0yMDI2LTAxIiwidHlwIjoiSldUIn0.eyJ...",
    "refresh_token": "gfr_v1_olQUEkji9Be6Inp5AbkaijnarX07BaeoPlnUAd3m18ESq0bT",
    "scope":          "epd:read"
}

Het refresh_token kan ingewisseld worden voor een nieuw access token via hetzelfde /oauth/token-endpoint met grant_type=refresh_token. Het nieuwe token krijgt automatisch dezelfde scope en target_audience als het originele token — je hoeft deze niet opnieuw mee te sturen.

← mTLS
Volgende: PRS → Volgende: NVI →