Làm cách nào tôi có thể trình bày 'Ủy quyền: Bearer <token>' trong Thông số Swagger (swagger.json)


112

Tôi đang cố gắng truyền đạt rằng lược đồ xác thực / bảo mật yêu cầu đặt tiêu đề như sau:

Authorization: Bearer <token>

Đây là những gì tôi có dựa trên tài liệu swagger :

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

Câu trả lời:


138

Có thể điều này có thể giúp:

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'

Bạn có thể sao chép và dán nó ra đây: http://editor.swagger.io/#/ để xem kết quả.

Ngoài ra còn có một số ví dụ trong web trình chỉnh sửa swagger với các cấu hình bảo mật phức tạp hơn có thể giúp bạn.


4
Tôi không hiểu cách bạn cho người biên tập biết người dùng và mật khẩu hoặc Mã thông báo cơ bản cần gửi để bạn có thể nhận được 200. Tôi có thiếu thứ gì không?
Rob

1
Ok, đừng bận tâm. Rõ ràng "Xác thực" là thứ bạn có thể nhấp vào để lấy biểu mẫu đăng nhập.
Rob

Vậy làm cách nào để đặt giá trị cho mã thông báo? tôi đã thử curl -x get --header "Authorization: apiKey = 123" nhưng không có gì xảy ra
Gobliins

2
@Gobliins bạn muốn curl -X GET -H "Authorization: Bearer your_token", your_tokenmã thông báo mang của bạn ở đâu . Ví dụcurl -X GET -H "Accept: application/json" -H "Authorization: Bearer 00000000-0000-0000-0000-000000000000" "http://localhost/secure-endpoint"
Steve K,

15
Đáng tiếc là điều này không làm việc tốt với Swagger UI - click "Authorize" và cung cấp một mã thông báo trần sẽ tạo ra "Thử nó ra" ví dụ curl với -H "Authorization: foo"thay vì -H "Authorization: Bearer foo"như câu trả lời OpenAPI 3
Abe Voelker

56

Xác thực mang trong OpenAPI 3.0.0

OpenAPI 3.0 hiện hỗ trợ xác thực Bearer / JWT nguyên bản. Nó được định nghĩa như thế này:

openapi: 3.0.0
...

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

security:
  - bearerAuth: []

Điều này được hỗ trợ trong Swagger UI 3.4.0+ và Swagger Editor 3.1.12+ (một lần nữa, chỉ dành cho thông số kỹ thuật OpenAPI 3.0!).

Giao diện người dùng sẽ hiển thị nút "Ủy quyền", bạn có thể nhấp và nhập mã thông báo mang (chỉ mã thông báo, không có tiền tố "Người mang"). Sau đó, các yêu cầu "dùng thử" sẽ được gửi kèm theo Authorization: Bearer xxxxxxtiêu đề.

Thêm Authorizationtiêu đề theo chương trình (Swagger UI 3.x)

Nếu bạn sử dụng Swagger UI và vì lý do nào đó, cần thêm Authorizationtiêu đề theo chương trình thay vì để người dùng nhấp vào "Ủy quyền" và nhập mã thông báo, bạn có thể sử dụng requestInterceptor. Giải pháp này dành cho Swagger UI 3.x ; UI 2.x đã sử dụng một kỹ thuật khác.

// index.html

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

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

1
Làm cách nào để triển khai điều này trong tài liệu swagger được tạo bằng flask-restplus?
Chang Zhao

Tôi nghi ngờ nếu câu trả lời phù hợp với câu hỏi đã được hỏi.
Vishrant

16

Tại sao "Câu trả lời được chấp nhận" hoạt động ... nhưng nó vẫn chưa đủ đối với tôi

Điều này hoạt động trong đặc điểm kỹ thuật. Ít nhất swagger-tools(phiên bản 0.10.1) xác nhận nó là hợp lệ.

Nhưng nếu bạn đang sử dụng các công cụ khác như swagger-codegen(phiên bản 2.1.6), bạn sẽ gặp một số khó khăn, ngay cả khi ứng dụng khách được tạo có chứa định nghĩa Xác thực, như sau:

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

Không có cách nào để chuyển mã thông báo vào tiêu đề trước khi phương thức (điểm cuối) được gọi. Nhìn vào chữ ký chức năng này:

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

Điều này có nghĩa là, tôi chỉ chuyển lệnh gọi lại (trong các trường hợp khác là tham số truy vấn, v.v.) mà không có mã thông báo, điều này dẫn đến việc xây dựng yêu cầu tới máy chủ không chính xác.

Thay thế của tôi

Thật không may, nó không "đẹp" nhưng nó hoạt động cho đến khi tôi nhận được hỗ trợ Mã thông báo JWT trên Swagger.

Lưu ý: đang được thảo luận trong

Vì vậy, nó xử lý xác thực giống như một tiêu đề tiêu chuẩn. Trên pathđối tượng, nối một paremeter tiêu đề:

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'

Điều này sẽ tạo ra một máy khách với một tham số mới trên chữ ký phương thức:

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

Để sử dụng phương pháp này theo đúng cách, chỉ cần chuyển "chuỗi đầy đủ"

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

Và hoạt động.


"mã thông báo đến từ nơi khác" ... Tôi quan tâm đến nơi khác. Điều gì xảy ra khi bạn đăng nhập được chuyển hướng đến thông tin đăng nhập của bạn và được chuyển hướng đến api vênh vang của bạn, làm thế nào bạn có thể sử dụng mã thông báo truy cập mà bạn nhận được?
Nadine

0

Đăng câu trả lời năm 2020 trong JSON bằng 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

Cách Hackie của tôi để giải quyết điều này là bằng cách sửa đổi tệp swagger.go trong gói echo-swagger trong trường hợp của tôi:

Ở cuối tệp, hãy cập nhật hàm window.onload để bao gồm một requestInterceptor định dạng đúng mã thông báo.

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

}

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.