El objetivo

Ser capaz de ejecutar una recopilación sin pasar por el proceso de autorización de cada llamada individualmente antes de ejecutar la recopilación.

Lo que intenté / noté

  1. Cuando utilizo el ayudante de autorización OAuth2 en Postman, no he descubierto un método para guardar un token de actualización devuelto y, por lo tanto, lo uso cuando el token de acceso expira para obtener uno nuevo. (He sugerido que esta función se coloque en el asistente en Problemas de Postman Github).

  2. Intenté crear algunos pasos al comienzo de la colección para replicar el asistente, pero no puedo pasar del paso en el que se requiere la interacción del usuario para aprobar / denegar (lo que tiene sentido ya que de lo contrario es un riesgo de seguridad). Sin embargo, parece que tampoco puedo averiguar cómo avisar al usuario, de la forma en que lo hace el ayudante de OAuth2.

  3. He bajado un poco mis expectativas con respecto al token de actualización y pensé que podría simplemente ejecutar la autenticación en la primera prueba en la lista, guardando el token de acceso de alguna manera en una variable global o de entorno, y luego usando ese token en el todas las pruebas posteriores, pero no he encontrado una manera de guardar el token de acceso generado a través del ayudante OAuth2.

Me encantaría saber si hay una solución para esto que dé como resultado que las colecciones se puedan ejecutar con un esfuerzo mínimo puesto en autorización. Esto se vuelve más importante con más pruebas escritas en una colección que usan la autorización OAuth2.

Nota al margen: he estado usando el cliente Mac Postman, en caso de que haya una diferencia en los clientes que desconozco.

35
Nate Ritter 28 ene. 2016 a las 23:00

3 respuestas

La mejor respuesta

Encontré una respuesta aquí en github.

Primero, configure estas variables de entorno:

  • url: (su punto final de API)
  • access_token: (en blanco)
  • refresh_token: (en blanco)
  • client_id: (su client_id)
  • client_secret: (su client_secret)
  • username: (su nombre de usuario)
  • password: (su contraseña)

A continuación, cree una nueva llamada que obtenga un access_token usando password grant_type.

En mi caso, publico en {{url}}/access_token. Con esta llamada se envía la siguiente información como pares clave / valor form-data especificados en la pestaña Cuerpo:

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

Enviar este POST dará como resultado algo como esta respuesta:

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

Luego, en la pestaña Pruebas, agregué el siguiente código para asignar dos de las variables de entorno, access_token y refresh_token.

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

NOTA: También puse una prueba allí, solo para asegurarme de que al menos esta llamada también funcionara correctamente, aunque esto no tiene nada que ver con la pregunta original:

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

Ahora, cualquier nueva llamada que cree puede usar el access_token generado por esa primera llamada como una variable de entorno como esta: {{access_token}}. En mi caso, voy a la pestaña Encabezados en una llamada / prueba y agrego esta clave / par:

  • Authorization: Bearer {{access_token}}

Puntos de bonificación: no he dado un ejemplo aquí, pero teóricamente podría agregar un script de solicitud previa que prueba el access_token actual (no en blanco) con la API y, si falla, obtener uno nuevo usando el dado (no en blanco) refresh_token. Esto haría que no tuviera que preocuparme por la expiración de los tokens de acceso.

Dicho todo esto, no me gusta esta solución porque requiere agregar esta primera llamada access_token a cada subcarpeta de mi colección porque si quiero ejecutar solo una subcarpeta y no la colección como un todo, necesito hacer seguro que tengo un nuevo access_token. No hacerlo significaría que todas las pruebas fallarían cuando expira un access_token. Si nunca ejecuta subcarpetas por separado en su Collection Runner, podría salirse con la suya creando solo una llamada access_token y configurándola como la primera llamada que se ejecutará en la colección.

Pero, por esa razón, todavía no voy a marcar esta como la respuesta correcta. Supongo que hay una respuesta mejor que la que se me ocurrió; idealmente, una en la que no tenga que duplicar la misma llamada / prueba de access_token en cada subcarpeta, pero obtengo el beneficio de la automatización, no interactiva pruebas con la flexibilidad de ejecutar una subcarpeta por sí misma o la colección como un todo.

17
Nate Ritter 28 ene. 2016 a las 23:16

Las otras dos respuestas son correctas. Pero hay otra forma de hacerlo y no requiere ninguna solicitud adicional. Este método utiliza el script pre-request de la solicitud que necesita access_token. Puede utilizar el pm.sendRequest tal como se documenta en la postman-sandbox-api

Desde el script de solicitud previa, simplemente envíe una solicitud a la URL del token de autenticación. Envíe todas las credenciales y el token de actualización. En la respuesta, obtendrá el token de acceso, que luego puede persistir en el entorno o simplemente en la memoria y luego usarlo.

Código de muestra He hecho una esencia aquí https://gist.github.com/harryi3t/dd5c61451206047db70710cff617

// 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);
});

Ahora, cuando se envía la solicitud, la variable accessToken estará presente, que puede usar en su solicitud de esta manera: ingrese la descripción de la imagen aquí

Nota: Hay 4 tipos de tipos de subvenciones en Oauth2. Dos de ellos (código de autenticación e implícito) requieren interacción con el navegador que no se puede automatizar. Pero si el servidor proporciona un token de actualización, el script anterior puede ayudarlo a obtener el token de acceso. Los otros dos tipos (credenciales de cliente y credenciales de contraseña) no requieren ninguna interacción del navegador. Entonces estos pueden automatizarse desde los scripts. Si está utilizando client_credentials, puede modificar el script anterior para obtener el code del authUrl y luego obtener el access_token del AuthTokenUrl.

1
Harry 21 sep. 2018 a las 03:59

Ok, primero ingrese la URL de su token OAUTH, haga clic en la pestaña Cuerpo y complete estos parámetros POST: client_id, grant_type, username, password, override.

enter image description here

Luego, haga clic en la pestaña Prueba, ingrese este texto y luego presione Enviar:

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

enter image description here

Luego ingrese una de las URL de su aplicación, haga clic en la pestaña Encabezados e ingrese un parámetro Autorización con un valor Portador {{access_token}}. Luego haga clic en Enviar.

enter image description here

Voila!

51
vovahost 1 sep. 2020 a las 15:20