webentwicklung-frage-antwort-db.com.de

Wie kann ein OAuth2-Token in Postman-Sammlungen beibehalten werden (oder ein Aktualisierungstoken verwendet werden)?

Das Ziel

Sie können eine Sammlung ausführen, ohne den Autorisierungsprozess jedes Anrufs einzeln durchlaufen zu müssen, bevor Sie die Sammlung ausführen.

Was ich versucht habe/bemerkte

  1. Bei der Verwendung des OAuth2-Autorisierungshilfsprogramms in Postman habe ich keine Methode zum Speichern eines zurückgegebenen Aktualisierungstokens gefunden. Ich verwende es daher, wenn das Zugriffstoken abläuft, um ein neues zu erhalten. (Ich habe vorgeschlagen, diese Funktion in den Postman Github Issues in den Helfer zu stellen.)

  2. Ich habe versucht, am Anfang der Sammlung ein paar Schritte zu erstellen, um den Helfer zu replizieren, aber ich kann den Schritt, bei dem die Benutzerinteraktion erforderlich ist, um zu genehmigen/abzulehnen (dies ist sinnvoll, da es sonst ein Sicherheitsrisiko ist), nicht möglich. Ich kann jedoch nicht herausfinden, wie ich den Benutzer auffordern soll, wie es der OAuth2-Helfer tut.

  3. Ich habe meine Erwartungen in Bezug auf das Aktualisierungstoken etwas verkürzt und dachte, ich könnte einfach die Authentifizierung beim ersten Test in der Liste ausführen, das Zugriffstoken irgendwie in einer globalen oder Umgebungsvariablen speichern und dann dieses Token im alle nachfolgenden Tests, aber ich habe keine Möglichkeit gefunden, das über den OAuth2-Helfer generierte Zugriffstoken zu speichern.

Ich würde gerne wissen, ob es eine Lösung gibt, die dazu führt, dass Sammlungen mit minimalem Aufwand ausgeführt werden können, wenn sie autorisiert werden. Dies wird umso wichtiger, je mehr Tests in einer Sammlung geschrieben werden, die alle die OAuth2-Autorisierung verwenden.

Randbemerkung: Ich habe den Postman-Mac-Client verwendet, für den Fall, dass es bei Clients, die mir nicht bekannt sind, ein Unterschied gibt.

14
Nate Ritter

Ich habe eine Antwort hier auf github gefunden.

Richten Sie zuerst diese Umgebungsvariablen ein:

  • url: (Ihr API-Endpunkt)
  • access_token: (leer)
  • refresh_token: (leer)
  • client_id: (Ihre client_id)
  • client_secret: (Ihr client_secret)
  • username: (Ihr Benutzername)
  • password: (Passwort)

Als Nächstes erstellen Sie einen neuen Anruf, der mithilfe der Variablen passwordaccess_token einen grant_type erhält.

In meinem Fall habe ich POST {{url}}/access_token. Bei diesem Aufruf werden die folgenden Informationen als form-data-Schlüssel/Wert-Paare auf der Registerkarte "Körper" angegeben:

  • grant_type: password
  • username: {{username}}
  • password: {{password}}
  • client_id: {{client_id}}
  • client_secret: {{client_secret}}

Das Senden dieser POST führt zu einer solchen Antwort:

{
  "access_token": "kciOMpcmRcGTKfoo",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "DMGAe2TGaFbar"
}

Dann habe ich auf der Registerkarte "Tests" den folgenden Code hinzugefügt, um zwei der Umgebungsvariablen access_token und refresh_token zuzuweisen.

var data = JSON.parse(responseBody);
postman.setEnvironmentVariable("access_token", data.access_token);
postman.setEnvironmentVariable("refresh_token", data.refresh_token);

HINWEIS: Ich habe auch einen Test durchgeführt, nur um sicherzustellen, dass zumindest dieser Aufruf auch richtig funktioniert hat, obwohl dies nichts mit der ursprünglichen Frage zu tun hat:

var jsonData = JSON.parse(responseBody);
tests["token_type is Bearer"] = jsonData.token_type === "Bearer";

Jetzt kann jeder neue Aufruf, den ich erstelle, den von diesem ersten Aufruf generierten access_token als Umgebungsvariable wie folgt verwenden: {{access_token}}. In meinem Fall gehe ich in einem Anruf/Test zur Registerkarte Kopfzeilen und füge diesen Schlüssel/das folgende Paar hinzu:

  • Authorization: Bearer {{access_token}}

Bonuspunkte: Ich habe hier kein Beispiel gegeben, aber theoretisch könnte ich ein Voranforderungsskript hinzufügen, das den aktuellen (nicht leeren) access_token gegen die API testet und, falls dies fehlschlägt, ein neues mit dem angegebenen (nicht -leer) refresh_token. Auf diese Weise müsste ich mir keine Sorgen darüber machen, dass Zugangs-Tokens ablaufen.

Alles in allem bin ich von dieser Lösung nicht begeistert, da für jeden Unterordner in meiner Sammlung der erste Aufruf von access_token erforderlich ist. Wenn ich nur einen Unterordner ausführen möchte und nicht die Sammlung als Ganzes, muss ich dies tun sicher, ich habe ein neues access_token. Andernfalls würden alle Tests fehlschlagen, wenn ein access_token abläuft. Wenn Sie in Ihrem Collection Runner keine Unterordner separat ausführen, können Sie nur einen access_token-Aufruf erstellen und als ersten Aufruf in der Collection festlegen. 

Aber aus diesem Grund werde ich das noch nicht als die richtige Antwort bezeichnen. Ich vermute, es gibt eine bessere Antwort als die, die ich mir ausgedacht habe - im Idealfall eine, bei der ich nicht den gleichen Aufruf/Test von access_token in jeden Unterordner duplizieren muss, aber die Vorteile von automatisierten, nicht interaktiven Funktionen nutzen Tests mit der Flexibilität, einen Unterordner selbst oder die Sammlung als Ganzes auszuführen.

13
Nate Ritter

Ok, geben Sie zuerst Ihre OAUTH Token-URL ein, klicken Sie auf die Registerkarte Body und füllen Sie diese POST Parameter aus: client_id, grant_type, username, password, override.

enter image description here

Klicken Sie dann auf die Registerkarte Test, geben Sie diesen Text ein und drücken Sie Senden:

var data = JSON.parse(responseBody);
postman.setGlobalVariable("access_token", data.access_token);
postman.setGlobalVariable("refresh_token", data.refresh_token);

enter image description here

Geben Sie dann eine Ihrer Anwendungs-URLs ein, klicken Sie auf die Registerkarte Header und geben Sie einen Parameter Authorization mit dem Wert Bearer {{access_token}} ein. Klicken Sie dann auf Senden.

enter image description here

Voila!

41
Percy Vega

Zuerst lies diese Antwort aus dem Thread. Betrachten Sie nun die zweite Hälfte der Frage (basierend auf den Kommentaren):

Wie verwende ich das Aktualisierungstoken?

  1. Erstellen Sie eine neue POST Anfrage (am einfachsten duplizieren Sie die Anfrage, die Sie zur Beschaffung des access_token erstellt haben).

enter image description here

  1. Entfernen Sie im Hauptteil username und password. Ersetzen Sie grant_type Durch "refresh_token". Fügen Sie refresh_token Mit dem Wert "{{refresh_token}}" hinzu, der auf die Variable verweist, die bei der ersten Autorisierung erstellt wurde ( haben Sie daran gedacht, diese Antwort zu lesen = ?)

enter image description here

  1. Stellen Sie sicher, dass in Ihrem Testabschnitt der Aktualisierungsanforderung die Postman-Variablen für access_token und refresh_token überschrieben werden. Warum? Denn immer wenn Sie eine Aktualisierung ausführen, erhalten Sie ein weiteres Aktualisierungstoken. Wenn Sie dieses neue Aktualisierungstoken nicht erfassen, wird das alte Aktualisierungstoken verwendet und von der API abgelehnt. Dann müssen Sie das Ganze von Schritt eins an erneut ausführen (d. H. Von diese Antwort ).

enter image description here

  1. Wenn Ihre Autorisierung abläuft, müssen Sie die ursprüngliche Anfrage, die Ihren Benutzernamen und Ihr Kennwort enthält, nicht mehr ausführen. Mit der soeben erstellten Anfrage können Sie die Aktualisierung fortlaufend fortsetzen. Dies ist besonders hilfreich, wenn Sie zusammenarbeiten und den API-Zugriff freigeben müssen, aber keinen Benutzernamen/keine Kennwörter freigeben möchten.

HTH!

1
HeyZiko

Die beiden anderen Antworten sind richtig. Es gibt jedoch einen anderen Weg, auf dem dies möglich ist und keine zusätzliche Anforderung erfordert. Diese Methode verwendet das pre-request-Skript der Anforderung, das den access_token..__ benötigt. Sie können den pm.sendRequest verwenden, wie im _ dokumentiert. postman-sandbox-api

Senden Sie einfach eine Anfrage vom Pre-Request-Skript an die URL des Auth-Token. Senden Sie alle Anmeldeinformationen und das Aktualisierungstoken. In der Antwort erhalten Sie das Zugriffstoken, das Sie in der Umgebung oder nur im Arbeitsspeicher beibehalten und dann verwenden können.

Beispielcode Ich habe hier einen Gist erstellt https://Gist.github.com/harryi3t/dd5c61451206047db70710ff6174c3c1

// Set all these variables in an environment or at collection level
let tokenUrl = pm.variables.get('tokenUrl'),
    clientId = pm.variables.get('clientId'),
    clientSecret = pm.variables.get('clientSecret'),
    refreshToken = pm.variables.get('refreshToken'),
    requestOptions = {
      method: 'POST',
      url: tokenUrl,
      body: {
        mode: 'formdata',
        formdata: [
            {
                key: 'grant_type',
                value: 'refresh_token'
            },
            {
                key: 'client_id',
                value: clientId
            },
            {
                key: 'client_secret',
                value: clientSecret
            },
            {
                key: 'refresh_token',
                value: refreshToken
            }
        ]
      }
    };

console.log({ requestOptions });

pm.sendRequest(requestOptions, (err, response) => {
  let jsonResponse = response.json(),
      newAccessToken = jsonResponse.access_token;

  console.log({ err, jsonResponse, newAccessToken })

  // If you want to persist the token
  pm.environment.set('accessToken', newAccessToken);

  // Or if you just want to use this in the current request and then discard it
  pm.variables.set('accessToken', newAccessToken);
});

Wenn nun die Anfrage gesendet wird, ist die Variable accessToken vorhanden, die Sie in Ihrer Anfrage wie folgt verwenden können: enter image description here

Hinweis: Es gibt 4 Arten von Zuschussarten in Oauth2. Zwei davon (Auth-Code und implizit) erfordern eine Interaktion mit dem Browser, die nicht automatisiert werden kann. Wenn der Server ein Aktualisierungs-Token bereitstellt, kann das obige Skript Ihnen dabei helfen, das Zugriffstoken zu erhalten. Die anderen beiden Typen (Client-Anmeldeinformationen und Kennwort-Anmeldeinformationen) erfordern keine Browser-Interaktion. So können diese von den Skripten aus automatisiert werden. Wenn Sie client_credentials verwenden, können Sie das obige Skript anpassen, um die code von der authUrl und dann den access_token von AuthTokenUrl zu erhalten.

1
Harry