Як я можу представити "Авторизація: Носій <token>" у специфіці Swagger (swagger.json)


112

Я намагаюся довести, що схема автентифікації / безпеки вимагає встановлення заголовка таким чином:

Authorization: Bearer <token>

Це те, що я базував на документах, що базуються :

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

Відповіді:


138

Можливо, це може допомогти:

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/#/, щоб перевірити результати.

Також в Інтернеті веб-редактора є кілька прикладів із складнішими конфігураціями безпеки, які можуть вам допомогти.


4
Я не бачу, як ви скажете редактору, який користувач та пароль або маркер Basic надіслати, щоб ви могли отримати 200. Я щось пропускаю?
Роб

1
Гаразд, неважливо. Мабуть, "Автентифікат" - це те, на що можна натиснути, щоб отримати форму для входу.
Роб

Тож як я можу встановити значення для маркера? я спробував curl -x get --header "Авторизація: apiKey = 123", але нічого не сталося
Gobliins

2
@Gobliins ви хочете curl -X GET -H "Authorization: Bearer your_token", де your_tokenваш маркер носія. Напр.curl -X GET -H "Accept: application/json" -H "Authorization: Bearer 00000000-0000-0000-0000-000000000000" "http://localhost/secure-endpoint"
Стів K

15
На жаль, це не працює добре з користувальницьким інтерфейсом Swagger - натискання кнопки "Авторизувати" та надання голого токена генерує приклади скручування "Спробуйте це" -H "Authorization: foo"замість того, -H "Authorization: Bearer foo"як відповідь OpenAPI 3
Abe Voelker

56

Аутентифікація носія у OpenAPI 3.0.0

OpenAPI 3.0 тепер підтримує автентифікацію Bearer / 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 3.1.12+ (знову ж таки, лише для специфікацій OpenAPI 3.0!).

UI відобразить кнопку "Авторизувати", за допомогою якої можна натиснути та ввести маркер носія (лише сам жетон, без префіксу "Носій"). Після цього запити "спробувати" надсилаються із 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
  }
})

1
Як я реалізую це в документації, що генерується flask-restplus?
Чанг Чжао

Я сумніваюся, чи відповідатимуть відповіді на поставлене питання.
Вишрант

16

Чому "Прийнятий відповідь" працює ... але мені це було недостатньо

Це працює в специфікації. Принаймні swagger-tools(версія 0.10.1) підтверджує це як дійсне.

Але якщо ви використовуєте інші інструменти, як-от swagger-codegen(версія 2.1.6), ви виявите деякі труднощі, навіть якщо створений клієнт містить визначення автентифікації, наприклад, таке:

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

Немає можливості передати маркер у заголовок до виклику методу (кінцевої точки). Подивіться на цю функцію:

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

Це означає, що я передаю лише зворотний виклик (в інших випадках параметри запиту тощо) без маркера, що призводить до неправильної побудови запиту до сервера.

Моя альтернатива

На жаль, це не "досить", але працює, поки я не отримаю підтримку JWT Tokens на 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);

І працює.


"жетон походить з інших місць" ... Мене цікавлять інші місця. Що робити, коли ви входили в систему, були спрямовані на ваш логін і були перенаправлені на ваш схожий файл api, як ви можете використовувати маркер доступу, який ви отримали?
Надін

0

Опублікування відповіді 2020 року в JSON за допомогою openapi 3.0.0:

{
  "openapi": "3.0.0",
  ...
  "servers": [
    {
      "url": "/"
    }
  ],
  ...
  "paths": {
    "/skills": {
      "put": {
        "security": [
           {
              "bearerAuth": []
           }
        ],
       ...
  },


  "components": {        
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}

0

Мій спосіб Хаккі вирішити це було, змінивши файл swagger.go в пакеті echo-swagger у моєму випадку:

Внизу файлу оновіть функцію window.onload, щоб включити requestInterceptor, який правильно форматує маркер.

window.onload = function() {
  // Build a system
  const ui = SwaggerUIBundle({
  url: "{{.URL}}",
  dom_id: '#swagger-ui',
  validatorUrl: null,
  presets: [
    SwaggerUIBundle.presets.apis,
    SwaggerUIStandalonePreset
  ],
  plugins: [
    SwaggerUIBundle.plugins.DownloadUrl
  ,
  layout: "StandaloneLayout",
  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer " + req.headers.Authorization
  return req
  }
})

window.ui = ui

}

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.