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
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.)
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.
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.
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 password
access_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.
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.
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);
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.
Voila!
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?
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 = ?)HTH!
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:
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.