Подтвердить что ты не робот

Как я могу представить "Authorization: Bearer <token>" в спецификации Swagger (swagger.json)

Я пытаюсь сказать, что для схемы аутентификации/защиты требуется установка заголовка следующим образом:

Authorization: Bearer <token>

Это то, что я основал на документации по swagger:

securityDefinitions:
  APIKey:
    type: apiKey
    name: Authorization
    in: header
security:
  - APIKey: []

Спасибо заранее!

4b9b3361

Ответ 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
  }
})