인증 / 보안 체계에 다음과 같이 헤더를 설정해야 함을 전달하려고합니다.
Authorization: Bearer <token>
이것이 내가 swagger 문서를 기반으로 한 것입니다 .
securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
인증 / 보안 체계에 다음과 같이 헤더를 설정해야 함을 전달하려고합니다.
Authorization: Bearer <token>
이것이 내가 swagger 문서를 기반으로 한 것입니다 .
securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
답변:
도움이 될 수 있습니다.
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 편집기 웹의 몇 가지 예가 있습니다.
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"
-H "Authorization: foo"
대신 -H "Authorization: Bearer foo"
OpenAPI를 3 대답처럼
이제 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
}
})
"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);
그리고 작동합니다.
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"
}
}
}
}
이 문제를 해결하는 내 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
}