Postman: Nie wieder den Access Token manuell erneuern

Postman ist toll! Aber der Umgang mit Access Token nervt. Häufig beobachte ich, wie Leute vor jedem einzelnen Request den Button „Get New Access Token“ klicken. Damit ist Schluss – denn es geht auch anders. In diesem Beitrag zeige ich Dir, wie Du den Access Token automatisch aktualisierst, bevor Du einen Request mit Postman abschickst. Das Beispiel bezieht sich auf eine Autorisierung via OAuth 2.0.

Schritt 1: Access Token-Variable einrichten

  • Öffne den Request, der einen Access Token benötigt und öffne den „Authorization“-Tab.
  • Wähle wie bei der manuellen Token-Autorisierung den entsprechenden Typ aus – in diesem Beispiel OAuth 2.0.
  • Unter „Current Token“ trage in das Feld „Access Token“ eine Umgebungsvariable ein, z. B. {{o_auth_token}}.
  • Ergänze in deinen Umgebungsvariablen die zuvor vergebene Variable. Du brauchst ihr keinen Wert zuweisen.
  • Trage den Header Prefix ein, in diesem Beispiel „Bearer“.

Schritt 2: Erstelle ein Pre-Request-Script

  • Wechsle in den Tab „Pre-request Script“.
  • Erstelle eine Funktion, die einen Token abruft und diesen in die zuvor angelegte Umgebungsvariable schreibt. Die Funktion erstellst Du nach folgendem Schema:
pm.sendRequest({
    url: "https://your-keycloak.de/auth/realms/YourRealm/...",
    method: 'POST',
    header: {
    'Accept': '*/*',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'your-keycloak.de'
    },
    body: {
        mode: 'urlencoded',
        urlencoded: [
        {key: 'grant_type', value: 'client_credentials', disabled: false},
        {key: 'client_id', value: 'my-service', disabled: false},
        {key: 'client_secret', value: whateveryoursecretis, disabled: false},
        {key: 'scope', value: 'openid', disabled: false}
        ]
    }
}, function (err, res) {
    pm.environment.set("o_auth_token", res.json().access_token);
})

Eine detaillierte Anleitung dazu findest Du in diesem Blog-Beitrag von Allen Helton. Er beschreibt zusätzlich, wie Du Deine Funktion so erweiterst, dass nicht vor jedem Request ein neuer Token erzeugt wird, sondern nur, wenn der alte abgelaufen ist.

Schritt 3: Optimiere das Pre-Request-Script

Natürlich kannst Du einige Parameter / Values durch Variablen ersetzen. Ich habe zum Beispiel die client_secrets in einer Umgebungsvariable gespeichert. Diese weise ich zunächst einer lokalen Variable zu. Die lokale Variable verwende ich wiederum in der sendRequest-Funktion. Das sieht folgendermaßen aus:

let my-client-secrets = pm.environment.get("my_client_secret");

pm.sendRequest({
    url: "https://your-keycloak.de/auth/realms/YourRealm/...",
    method: 'POST',
    header: {
    'Accept': '*/*',
    'Content-Type': 'application/x-www-form-urlencoded',
    'Host': 'your-keycloak.de'
    },
    body: {
        mode: 'urlencoded',
        urlencoded: [
        {key: 'grant_type', value: 'client_credentials', disabled: false},
        {key: 'client_id', value: 'my-service', disabled: false},
        {key: 'client_secret', value: my-client-secrets, disabled: false},
        {key: 'scope', value: 'openid', disabled: false}
        ]
    }
}, function (err, res) {
    pm.environment.set("o_auth_token", res.json().access_token);
})

Schritt 4: Mache Dein Pre-Request-Script wiederverwendbar

Damit ich das Script nicht für jeden Request vollständig dupliziere, lege ich es als globale Variable fest und rufe es über die eval()-Funktion im Pre-Request-Script auf. Sollte ich einmal etwas an dem Access-Token-Skript ändern, muss ich es nur an einer Stelle anfassen.

  • Wechsle zu Deinen „Environments“ und wähle „Globals“ aus.
  • Lege eine neue Variable an, z. B. getClientCredentialsTokenFunction.
  • Kopiere das gesamte Pre-Request-Script.
  • Klicke auf Deine Collection und öffne darin das Pre-Request-Script.
  • Füge das Access-Token-Script ein.
  • Abschließend musst Du es per postman.setGlobalVariable() in Deine globale Variable speichern. Das sieht folgendermaßen aus:
postman.setGlobalVariable("getClientCredentialsTokenFunction", () => {
    pm.sendRequest({
        url: "https://your-keycloak.de/auth/realms/YourRealm/...",
        method: 'POST',
        header: {
        'Accept': '*/*',
        'Content-Type': 'application/x-www-form-urlencoded',
        'Host': 'your-keycloak.de'
        },
        body: {
            mode: 'urlencoded',
            urlencoded: [
            {key: 'grant_type', value: 'client_credentials', disabled: false},
            {key: 'client_id', value: 'my-service', disabled: false},
            {key: 'client_secret', value: my-client-secrets, disabled: false},
            {key: 'scope', value: 'openid', disabled: false}
            ]
        }
    }, function (err, res) {
        pm.environment.set("o_auth_token", res.json().access_token);
    })
});

Um das Script nun vor einem Request auszuführen, wechsle wieder in das Pre-Request-Script des jeweiligen Requests und rufe dort die Funktion auf:

// This function requests a token before sending the actual request
getClientCredentialsToken = eval(pm.globals.get("getClientCredentialsTokenFunction"));
getClientCredentialsToken();

Die erste Zeile speichert das gesamte Script als ausführbares JavaScript ab. Mit der zweiten Zeile rufst Du das Script endgültig auf.

Schlusswort

Auf den ersten Blick wirkt es sehr aufwändig, das Access Token automatisiert abzurufen. Wenn Du ein wenig Vorerfahrung mit Postman hast, dauert die Einrichtung aber höchstens 15 Minuten. Anschließend sparst Du Dir eine Menge Zeit – und kannst den Request auch unbesorgt in einem Collection Runner laufen lassen, da er sich nun selbst um das Access Token kümmert.


Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.