Как я могу представить "Authorization: Bearer <token>" в спецификации Swagger (swagger.json)
Я пытаюсь сказать, что для схемы аутентификации/защиты требуется установка заголовка следующим образом:
Authorization: Bearer <token>
Это то, что я основал на документации по swagger:
securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
Спасибо заранее!
Ответы
Ответ 1
Возможно, это может помочь:
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'
Вы можете скопировать и вставить его здесь: http://editor.swagger.io/#/, чтобы проверить результаты.
В веб-редакторе swagger также есть несколько примеров с более сложными конфигурациями безопасности, которые могут вам помочь.
Ответ 2
Почему "Принимаемый ответ" работает... но для меня этого было недостаточно.
Это работает в спецификации. По крайней мере swagger-tools
(версия 0.10.1) проверяет его как действительный.
Но если вы используете другие инструменты, такие как swagger-codegen
(версия 2.1.6), вы найдете некоторые трудности, даже если созданный клиент содержит определение аутентификации, например:
this.authentications = {
'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};
Невозможно передать токен в заголовок до вызова метода (конечной точки). Посмотрите на эту подпись функции:
this.rootGet = function(callback) { ... }
Это означает, что я передаю только обратный вызов (в других случаях параметры запроса и т.д.) без токена, что приводит к неправильной сборке запроса на сервер.
Моя альтернатива
К сожалению, это не "красиво", но работает, пока я не получаю поддержку токенов JWT в Swagger.
Примечание: это обсуждается в
Таким образом, он обрабатывает аутентификацию, как стандартный заголовок. В объекте path
добавьте пареметр заголовка:
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'
Это создаст клиент с новым параметром подписи метода:
this.rootGet = function(authorization, callback) {
// ...
var headerParams = {
'authorization': authorization
};
// ...
}
Чтобы использовать этот метод в правильном направлении, просто передайте "полную строку"
// 'token' and 'cb' comes from elsewhere
var header = 'Bearer ' + token;
sdk.rootGet(header, cb);
И работает.
Ответ 3
Проверка подлинности на предъявителя в OpenAPI 3.0.0
OpenAPI 3.0 теперь поддерживает оповещение на предъявителя /JWT. Он определяется следующим образом:
openapi: 3.0.0
...
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: JWT # optional, for documentation purposes only
security:
- bearerAuth: []
Это поддерживается в Swagger UI 3.4.0+ и Swagger Editor 3.1.12+ (опять же, только для спецификаций OpenAPI 3.0!).
Пользовательский интерфейс отобразит кнопку "Авторизовать", которую вы можете щелкнуть и ввести маркер-носитель. После этого запросы "попробуйте" будут отправлены с заголовком Authorization: Bearer xxxxxx
.
Добавление Authorization
заголовка программно (Swagger UI 3.x)
Если вы используете интерфейс Swagger и по какой-то причине необходимо добавить заголовок Authorization
программно, вместо того, чтобы пользователи нажимали "Авторизовать" и вводили токен, вы можете использовать requestInterceptor
. Это решение для Swagger UI 3.x; UI 2.x использовал другую технику.
// index.html
const ui = SwaggerUIBundle({
url: "http://your.server.com/swagger.json",
...
requestInterceptor: (req) => {
req.headers.Authorization = "Bearer xxxxxxx"
return req
}
})