Saltar al contenido

¿Cómo puedo representar ‘Autorización: Portador ‘en una Swagger Spec (swagger.json)

Solución:

Quizás esto pueda ayudar:

swagger: '2.0'
info:
  version: 1.0.0
  title: Based on "Basic Auth Example"
  description: >
    An example for how to use Auth with Swagger.

host: basic-auth-server.herokuapp.com
schemes:
  - http
  - https
securityDefinitions:
  Bearer:
    type: apiKey
    name: Authorization
    in: header
paths:
  /:
    get:
      security:
        - Bearer: []
      responses:
        '200':
          description: 'Will send `Authenticated`'
        '403': 
          description: 'You do not have necessary permissions for the resource'

Puede copiarlo y pegarlo aquí: http://editor.swagger.io/#/ para ver los resultados.

También hay varios ejemplos en la web del editor swagger con configuraciones de seguridad más complejas que podrían ayudarlo.

Autenticación de portador en OpenAPI 3.0.0

OpenAPI 3.0 ahora admite la autenticación Bearer / JWT de forma nativa. Se define así:

openapi: 3.0.0
...

components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT  # optional, for documentation purposes only

security:
  - bearerAuth: []

Esto es compatible con Swagger UI 3.4.0+ y Swagger Editor 3.1.12+ (nuevamente, ¡solo para especificaciones de OpenAPI 3.0!).

La interfaz de usuario mostrará el botón “Autorizar”, en el que puede hacer clic e ingresar el token de portador (solo el token en sí, sin el prefijo “Bearer”). Después de eso, las solicitudes de “pruébalo” se enviarán con el Authorization: Bearer xxxxxx encabezamiento.

Añadiendo Authorization encabezado mediante programación (Swagger UI 3.x)

Si usa la interfaz de usuario de Swagger y, por alguna razón, necesita agregar el Authorization encabezado mediante programación en lugar de que los usuarios hagan clic en “Autorizar” e ingresen el token, puede usar el requestInterceptor. Esta solución es para Interfaz de usuario Swagger 3.x; UI 2.x utilizó una técnica diferente.

// index.html

const ui = SwaggerUIBundle({
  url: "http://your.server.com/swagger.json",
  ...

  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer xxxxxxx"
    return req
  }
})

Por qué funciona “Respuesta aceptada” … pero no fue suficiente para mí

Esto funciona en la especificación. Por lo menos swagger-tools (versión 0.10.1) lo valida como válido.

Pero si está utilizando otras herramientas como swagger-codegen (versión 2.1.6) encontrará algunas dificultades, incluso si el cliente generado contiene la definición de Autenticación, como esta:

this.authentications = {
  'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};

No hay forma de pasar el token al encabezado antes de que se llame al método (punto final). Mire en esta firma de función:

this.rootGet = function(callback) { ... }

Esto significa que solo paso la devolución de llamada (en otros casos, parámetros de consulta, etc.) sin un token, lo que conduce a una compilación incorrecta de la solicitud al servidor.

Mi alternativa

Desafortunadamente, no es “bonito” pero funciona hasta que obtengo el soporte de JWT Tokens en Swagger.

Nota: que se está discutiendo en

  • seguridad: agregue soporte para el encabezado de autorización con el esquema de autenticación del portador # 583
  • ¿Extensibilidad de las definiciones de seguridad? # 460

Entonces, maneja la autenticación como un encabezado estándar. Sobre path el objeto agrega un parámetro de encabezado:

swagger: '2.0'
info:
  version: 1.0.0
  title: Based on "Basic Auth Example"
  description: >
    An example for how to use Auth with Swagger.

host: localhost
schemes:
  - http
  - https
paths:
  /:
    get:
      parameters:
        - 
          name: authorization
          in: header
          type: string
          required: true
      responses:
        '200':
          description: 'Will send `Authenticated`'
        '403': 
          description: 'You do not have necessary permissions for the resource'

Esto generará un cliente con un nuevo parámetro en la firma del método:

this.rootGet = function(authorization, callback) {
  // ...
  var headerParams = {
    'authorization': authorization
  };
  // ...
}

Para usar este método de la manera correcta, simplemente pase la “cadena completa”

// 'token' and 'cb' comes from elsewhere
var header="Bearer " + token;
sdk.rootGet(header, cb);

Y funciona.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *