hub - ¿Cómo puedo representar ''Autorización: portador<token>'' en una especificación Swagger(swagger.json)
swagger ui url (3)
Estoy tratando de transmitir que el esquema de autenticación / seguridad requiere establecer un encabezado de la siguiente manera:
Authorization: Bearer <token>
Esto es lo que he basado en la documentación de swagger :
securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
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 OpenAPI 3.0!).
La interfaz de usuario mostrará el botón "Autorizar", en el que puede hacer clic e ingresar el token del portador (solo el token en sí, sin el prefijo "Bearer").
Después de eso, las solicitudes de "probar" se enviarán con el encabezado
Authorization: Bearer xxxxxx
.
Agregar encabezado de
Authorization
programación (Swagger UI 3.x)
Si usa la interfaz de usuario de Swagger y, por alguna razón, necesita agregar el encabezado de
Authorization
programación en lugar de hacer que los usuarios
requestInterceptor
clic en "Autorizar" e ingresen el token, puede usar
requestInterceptor
.
Esta solución es para
Swagger UI 3.x
;
UI 2.x usó 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
}
})
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.
Por qué funciona la "Respuesta aceptada" ... pero no fue suficiente para mí
Esto funciona en la especificación.
Al 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 llamar al método (punto final). Mira 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 obtenga 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 de portador # 583
- Extensibilidad de las definiciones de seguridad? # 460
Por lo tanto, es manejar la autenticación como un encabezado estándar.
En el objeto de
path
agregue 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.