認証/セキュリティスキームでは、次のようにヘッダーを設定する必要があることを伝えようとしています:
Authorization: Bearer <token>
これは、 swagger documentationに基づいて私が持っているものです:
securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
認証/セキュリティスキームでは、次のようにヘッダーを設定する必要があることを伝えようとしています:
Authorization: Bearer <token>
これは、 swagger documentationに基づいて私が持っているものです:
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 には、より複雑なセキュリティ構成を備えたいくつかの例があり、役立つ可能性があります。
OpenAPI 3.0はベアラー/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 に [Authorize] ボタンが表示されます。このボタンをクリックして、ベアラー トークンを入力します (トークン自体のみで、"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
}
})
「受け入れられた回答」が機能する理由...しかし、私には十分ではありませんでした
これは仕様で機能します。少なくともswagger-tools
(バージョン 0.10.1) は有効であると検証します。
ただし、(バージョン 2.1.6) などの他のツールを使用しswagger-codegen
ている場合は、生成されたクライアントに次のような認証定義が含まれていても、いくつかの問題が発生します。
this.authentications = {
'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};
メソッド (エンドポイント) が呼び出される前にトークンをヘッダーに渡す方法はありません。この関数シグネチャを調べてください。
this.rootGet = function(callback) { ... }
これは、トークンなしでコールバック (他の場合はクエリ パラメータなど) のみを渡すことを意味します。これにより、サーバーへのリクエストが正しくビルドされません。
私の代替
残念ながら、それは「きれい」ではありませんが、Swagger で JWT トークンがサポートされるまでは機能します。
注:これはで議論されています
したがって、標準ヘッダーのように認証を処理します。オブジェクト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);
そして動作します。
requestInterceptor を使用すると、うまくいきました。
const ui = SwaggerUIBundle({
...
requestInterceptor: (req) => {
req.headers.Authorization = "Bearer " + req.headers.Authorization;
return req;
},
...
});