148

認証/セキュリティスキームでは、次のようにヘッダーを設定する必要があることを伝えようとしています:

Authorization: Bearer <token>

これは、 swagger documentationに基づいて私が持っているものです:

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

7 に答える 7

172

多分これは助けることができます:

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 には、より複雑なセキュリティ構成を備えたいくつかの例があり、役立つ可能性があります。

于 2015-10-07T14:56:55.793 に答える
83

OpenAPI 3.0.0 でのベアラー認証

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
  }
})
于 2017-08-02T21:07:34.610 に答える
19

「受け入れられた回答」が機能する理由...しかし、私には十分ではありませんでした

これは仕様で機能します。少なくとも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);

そして動作します。

于 2016-08-02T17:36:48.977 に答える
1

requestInterceptor を使用すると、うまくいきました。

const ui = SwaggerUIBundle({
  ...
  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer " + req.headers.Authorization;
    return req;
  },
  ...
});
于 2020-10-27T03:13:37.033 に答える