· 4 min de lectura

Agregar Autenticación a las pruebas de API con Portman

Probar APIs seguras a través de automatización puede ser complicado. Afortunadamente, Portman proporciona una forma fácil de incluir autenticación en la automatización de tus pruebas.

Portman CLI

Este artículo fue traducido usando IA.

Cuando creas una API, quieres tener seguridad para evitar uso indebido e incurrir en costos por uso no intencionado. Cada vez que agregamos una capa de seguridad a nuestras APIs, cualquier automatización que tengamos se vuelve automáticamente más compleja. Portman proporciona formas de configurar la autenticación para que se use cuando se ejecuta. En este post configuraremos Portman para ejecutarse exitosamente contra nuestra API segura.

Usaremos la API a la que ya le agregamos configuración de Portman en el post Mejora tus pruebas de API usando Portman. Primero necesitamos agregar seguridad a la API para que solo permita acceso a llamadas realizadas con una API key válida, después podemos configurar Portman para usar esa API Key y realizar exitosamente todas las solicitudes necesarias.

Aquí está el código fuente del resultado final. Si quieres seguir el tutorial, clona/descarga este commit.

Agregar Seguridad a API Gateway

Para agregar autenticación con API Key a la API, agregaremos la propiedad Auth en el recurso de API en el template de SAM como se muestra a continuación:

ProductsAPI:
    Type: AWS::Serverless::Api
    Properties:
        StageName: Lambdaless
        Auth:
          ApiKeyRequired: true
          UsagePlan:
            CreateUsagePlan: PER_API
            UsagePlanName: ProductsAPIUsagePlan
        DefinitionBody:
          'Fn::Transform':
            Name: AWS::Include
            Parameters:
              Location: ./products-openapi.yaml

También agregaremos el ApiKeyId en la sección de Outputs para ayudarnos a recuperar la API Key más tarde

ApiKeyId:
    Description: API Key ApiKeyId
    Value: !Ref ProductsAPIApiKey

Una vez que la API se despliega con estos cambios, ahora requerirá una API Key en el header. Esto causará que las pruebas de Portman fallen con un 403 ya que no está proporcionando el header todavía. No entraré en más detalles sobre cómo funciona la seguridad en API Gateway ya que no está en el alcance de este artículo.

Obtener la API Key

Hay dos formas de obtener la API Key que fue generada:

  • Ir a la consola y recuperarla del servicio API Gateway
  • Con el CLI. A continuación explicaré cómo hacerlo desde el CLI.
  1. Primero necesitamos obtener el API Id. Podemos hacer esto ejecutando el siguiente comando:

aws cloudformation describe-stacks --stack-name products-service

La respuesta de este comando viene con los Outputs definidos en el template de SAM donde hemos incluido el ApiKeyId. Copia el valor presentado en el OutputValue.

  1. Ahora necesitamos ejecutar el siguiente comando reemplazando el valor de —api-key con el valor copiado del paso anterior para obtener la API Key que podemos incluir en nuestros headers:

aws apigateway get-api-key --api-key REPLACE_WITH_APIID --include-value

La API Key estará contenida en el atributo “value” en la respuesta. Cópiala ya que la usaremos para la configuración de Portman en un momento.

Agregar definiciones de seguridad en el OpenAPI

Si intentas ejecutar Portman ahora obtendrás respuestas 403 Forbidden porque Portman no está proporcionando una API key en la solicitud. Portman usa tu definición OpenAPI para generar y ejecutar las pruebas, si no definimos los securitySchemes no sabrá aplicarlos. Así que primero necesitamos configurar los securitySchemes soportados por nuestra API que en nuestro caso es solo API Key, para hacer esto agregaremos el siguiente YAML bajo la sección components de nuestro spec OpenAPI.

 securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: X-API-KEY

OpenAPI soporta varios esquemas de autenticación, si deseas aprender más sobre estos revisa la documentación de OpenAPI aquí. Portman actualmente soporta los esquemas de seguridad API Key, HTTP basic auth y HTTP bearer token.

En OpenAPI puedes aplicar un esquema de seguridad diferente por endpoint, en nuestro caso queremos aplicar el mismo en toda la API. Para hacer esto agregaremos la propiedad security a nivel raíz para definirlo como se muestra a continuación.

security:
  - ApiKeyAuth: []

Si ejecutamos Portman de nuevo seguiremos obteniendo una respuesta 403 ya que todavía no le estamos diciendo a Portman qué API Key usar.

Configurar Portman para usar una API Key

Portman te permite configurar securityOverwrites en la sección globals de tu archivo de configuración de Portman. Actualizaremos el nuestro para incluir un overwrite para el apiKey.

{
  "securityOverwrites": {
    "apiKey": {
      "value": "INSERTA LA API KEY AQUÍ"
    }
  }
}

Ahora si ejecutamos Portman obtendremos una ejecución exitosa tal como lo teníamos antes de agregar seguridad a la API.

Resumen

En este post probamos exitosamente una API segura usando Portman al:

  • Agregar seguridad a la API
  • Actualizar el spec OpenAPI para definir el tipo de autenticación a usar
  • Configurar Portman para incluir exitosamente una API key en el header de cada solicitud para poder automatizar nuestras pruebas de API para APIs seguras

Recursos