web-dev-qa-db-fra.com

Comment conserver un jeton OAuth2 (ou utiliser un jeton d'actualisation) dans les collections Postman?

Le but

Être en mesure d'exécuter une collection sans passer par le processus d'autorisation de chaque appel individuellement avant de l'exécuter.

Ce que j'ai tenté/remarqué

  1. Lors de l'utilisation de l'assistant d'autorisation OAuth2 dans Postman, je n'ai pas trouvé de méthode pour enregistrer un jeton d'actualisation renvoyé. Je l'utilise donc lorsque le jeton d'accès expire pour en obtenir un nouveau. (J'ai suggéré de placer cette fonctionnalité dans l'assistant des problèmes de Postman Github.)

  2. J'ai essayé de créer quelques étapes au début de la collection pour répliquer l'assistant, mais je ne peux pas aller au-delà de l'étape où l'interaction de l'utilisateur est requise pour approuver/refuser (ce qui est logique car il s'agit d'un risque de sécurité sinon). Cependant, je n'arrive pas à comprendre comment inviter l'utilisateur, comme le fait l'aide OAuth2.

  3. J'ai abaissé mes attentes en ce qui concerne le jeton d'actualisation et je pensais pouvoir simplement exécuter l'authentification sur le premier test de la liste, en enregistrant le jeton d'accès d'une manière ou d'une autre dans une variable globale ou d'environnement, puis en utilisant ce jeton dans la liste. Tous les tests suivants, mais je n'ai pas trouvé de moyen de sauvegarder le jeton d'accès généré via l'aide OAuth2.

J'aimerais savoir s'il existe une solution permettant de gérer les collections avec un minimum d'effort lors de l'autorisation. Cela devient plus important avec le nombre de tests écrits dans une collection utilisant tous l'autorisation OAuth2.

Note latérale: J'utilise le client Mac Postman, au cas où il en serait autrement chez les clients que je ne connais pas.

14
Nate Ritter

J'ai trouvé une réponse ici sur github .

Commencez par configurer ces variables d’environnement:

  • url: (votre point de terminaison d'API)
  • access_token: (vide)
  • refresh_token: (vide)
  • client_id: (votre client_id)
  • client_secret: (votre client secret)
  • username: (votre nom d'utilisateur)
  • password: (votre mot de passe)

Ensuite, créez un nouvel appel qui obtient un access_token en utilisant la passwordgrant_type.

Dans mon cas, je POST à {{url}}/access_token. Les informations suivantes sont envoyées avec cet appel sous forme de paires form-data clé/valeur spécifiées dans l'onglet Corps:

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

L'envoi de ce POST donnera comme résultat la réponse suivante:

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

Ensuite, dans l'onglet Tests, j'ai ajouté le code suivant pour affecter deux des variables d'environnement, access_token et refresh_token.

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

NOTE: J'ai également mis un test à l'intérieur, juste pour m'assurer qu'au moins cet appel a bien fonctionné également, bien que cela n'ait rien à voir avec la question initiale:

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

Désormais, tout nouvel appel que je crée peut utiliser le access_token généré par ce premier appel en tant que variable d’environnement comme celle-ci: {{access_token}}. Dans mon cas, je vais à l'onglet En-têtes dans un appel/test et ajoute cette clé/paire:

  • Authorization: Bearer {{access_token}}

Points bonus: je n'ai pas donné d'exemple ici, mais théoriquement, je pourrais ajouter un script de pré-requête qui teste le access_token actuel (non vide) avec l'API et, en cas d'échec, en obtenir un nouveau en utilisant le paramètre donné (non -blank) refresh_token. Cela ferait en sorte que je n'aurais pas à m'inquiéter de l'expiration des jetons d'accès.

Ceci étant dit, cette solution ne me passionne pas, car elle nécessite l'ajout de ce premier appel access_token à chaque sous-dossier de ma collection, car si je souhaite exécuter un sous-dossier uniquement et non la collection dans son ensemble, je dois bien sûr, j'ai un nouveau access_token. Ne pas le faire signifierait que tous les tests échoueraient lorsqu'un access_token expirait. Si vous n'exécutez jamais de sous-dossiers séparément dans votre Collection Runner, vous pourriez vous en tirer en ne créant qu'un seul appel access_token et en le définissant comme le premier appel à être exécuté dans la collection. 

Mais, pour cette raison, je ne vais pas marquer ceci comme la bonne réponse pour le moment. J'imagine qu'il existe une meilleure réponse que celle que j'ai suggérée. Idéalement, je n'ai pas à dupliquer le même appel/test access_token dans chaque sous-dossier, mais à tirer parti des avantages d'un système automatisé et non interactif. teste avec la possibilité d'exécuter un sous-dossier seul ou la collection dans son ensemble.

13
Nate Ritter

OK, entrez d’abord votre URL de jeton OAUTH, cliquez sur l’onglet Corps et spécifiez les paramètres POST suivants:.

 enter image description here

Ensuite, cliquez sur l'onglet Test, entrez ce texte, puis appuyez sur Envoyer:

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

 enter image description here

Puis entrez l'une des URL de votre application, cliquez sur l'onglet En-têtes, puis entrez un paramètre Autorisation avec une valeur Bearer {{access_token}}. Puis cliquez sur Envoyer.

 enter image description here

Voila!

33
Percy Vega

Les deux autres réponses sont correctes. Mais il existe un autre moyen de le faire, qui ne nécessite aucune requête supplémentaire . Cette méthode utilise le script pre-request de la demande qui nécessite le access_token. Vous pouvez utiliser le pm.sendRequest décrit dans le fichier postman-sandbox-api

À partir du script de pré-requête, envoyez simplement une requête à l'URL de jeton automatique. Envoyez toutes les informations d'identification et le jeton d'actualisation. Dans la réponse, vous obtiendrez le jeton d'accès, que vous pourrez ensuite conserver dans l'environnement ou tout simplement en mémoire, puis l'utiliser.

Exemple de code J'ai rédigé un Gist ici 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);
});

Maintenant, lorsque la demande est en cours d'envoi, la variable accessToken sera présente, ce que vous pourrez utiliser dans votre demande comme ceci:  enter image description here

Remarque: Il existe 4 types de types de subvention dans Oauth2. Deux d'entre eux (Auth code & Implicit) nécessitent une interaction avec le navigateur qui ne peut pas être automatisée. Mais si le serveur fournit un jeton d'actualisation, le script ci-dessus peut vous aider à obtenir le jeton d'accès. Les deux autres types (identifiants client et identifiants de mot de passe) ne nécessitent aucune interaction du navigateur. Donc, ceux-ci peuvent être automatisés à partir des scripts. Si vous utilisez client_credentials, vous pouvez modifier le script ci-dessus pour obtenir code à partir de authUrl, puis le access_token à partir de AuthTokenUrl.

1
Harry