認証/セキュリティスキームでは、ヘッダーを次のように設定する必要があることを伝えようとしています。
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エディターのWebには、より複雑なセキュリティ構成が役立ついくつかの例もあります。
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.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に「承認」ボタンが表示されます。このボタンをクリックすると、ベアラートークン(「ベアラー」接頭辞なしのトークン自体のみ)をクリックして入力できます。その後、「試してみる」リクエストが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
}