Swagger Spec (swagger.json)에서 'Authorization : Bearer <token>'을 어떻게 표현할 수 있습니까?


112

인증 / 보안 체계에 다음과 같이 헤더를 설정해야 함을 전달하려고합니다.

Authorization: Bearer <token>

이것이 내가 swagger 문서를 기반으로 한 것입니다 .

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/#/ 에서 복사하여 붙여 넣어 결과를 확인할 수 있습니다.

또한 사용자에게 도움이 될 수있는보다 복잡한 보안 구성이 포함 된 swagger 편집기 웹의 몇 가지 예가 있습니다.


4
200을받을 수 있도록 어떤 사용자와 암호 또는 기본 토큰을 보낼지 편집기에게 알려주는 방법을 알 수 없습니다. 뭔가 빠졌나요?
Rob은

1
확인 결코 마음. 분명히 "인증"은 로그인 양식을 얻기 위해 클릭 할 수있는 것입니다.
Rob

그렇다면 토큰에 값을 어떻게 설정합니까? 나는 curl -x get --header "Authorization : apiKey = 123"을 시도했지만 아무 일도 일어나지 않았습니다.
Gobliins

2
@Gobliins you want 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
불행하게도이 자신감 UI와 함께 잘 작동하지 않습니다 - 클릭 "권한 부여"를 베어 토큰을 제공하는 생성과 컬 예제를 "그것을 밖으로 시도"것 -H "Authorization: foo"대신 -H "Authorization: Bearer foo"OpenAPI를 3 대답처럼
아베 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 Editor 3.1.12+에서 지원됩니다 (다시 OpenAPI 3.0 사양에만 해당됩니다!).

UI에 "승인"버튼이 표시되며,이를 클릭하여 베어러 토큰 ( "Bearer"접두어없이 토큰 자체 만)을 입력 할 수 있습니다. 그 후 "시도"요청이 Authorization: Bearer xxxxxx헤더 와 함께 전송됩니다 .

Authorization프로그래밍 방식으로 헤더 추가 (Swagger UI 3.x)

Swagger UI를 사용하고 어떤 이유로 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 생성 swagger 문서에서 어떻게 구현합니까?
Chang Zhao

답변이 질문과 일치하는지 의심됩니다.
Vishrant

16

"Accepted Answer"가 작동하는 이유 ...하지만 나에게는 충분하지 않았습니다.

이것은 사양에서 작동합니다. 적어도 swagger-tools(버전 0.10.1)은 유효한 것으로 확인합니다.

그러나 swagger-codegen(버전 2.1.6) 과 같은 다른 도구를 사용하는 경우 생성 된 클라이언트에 다음과 같은 인증 정의가 포함되어 있어도 몇 가지 어려움이 있습니다.

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

method (endpoint)가 호출되기 전에는 토큰을 헤더에 전달할 방법이 없습니다. 이 함수 서명을 살펴보십시오.

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

즉, 토큰없이 콜백 (다른 경우 쿼리 매개 변수 등) 만 전달하므로 서버에 대한 요청 빌드가 잘못됩니다.

내 대안

불행히도 "예쁘다"는 것은 아니지만 Swagger에서 JWT 토큰 지원을 받기 전까지는 작동합니다.

참고 :

따라서 표준 헤더와 같은 인증을 처리합니다. 에 path개체 헤더 paremeter를 추가 :

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);

그리고 작동합니다.


"토큰은 다른 곳에서 온다"... 나는 다른 곳에 관심이 있습니다. 로그인했을 때 로그인으로 이동하고 Swagger API로 리디렉션되었을 때받은 액세스 토큰을 어떻게 사용할 수 있습니까?
Nadine

0

openapi 3.0.0을 사용하여 JSON으로 2020 답변 게시 :

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


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

0

이 문제를 해결하는 내 Hackie 방법은 내 경우에 echo-swagger 패키지의 swagger.go 파일을 수정하는 것입니다.

파일 하단에서 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

}

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.