Swauthor仕様(swagger.json)で「Authorization:Bearer <token>」を表すにはどうすればよいですか


回答:


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エディターのWebには、より複雑なセキュリティ構成が役立ついくつかの例もあります。


4
200を取得できるように、送信するユーザーとパスワードまたは基本トークンをエディターにどのように指示するのかわかりません。何か不足していますか?
Rob

1
分かった、気にしないで。どうやら「認証」は、ログインフォームを取得するためにクリックできるものです。
Rob

それでは、トークンに値を設定するにはどうすればよいですか?curl -x get --header "Authorization:apiKey = 123"を試してみましたが、何も起こりませんでした
Gobliins

2
あなたが望む@Gobliins 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
残念ながら、これはSwagger UIではうまく機能しません。「Authorize」をクリックしてベアトークンを提供すると、OpenAPI 3の回答では-H "Authorization: foo"なく、「試してみる」カールの例が生成され-H "Authorization: Bearer foo"ます
Abe 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に「承認」ボタンが表示されます。このボタンをクリックすると、ベアラートークン(「ベアラー」接頭辞なしのトークン自体のみ)をクリックして入力できます。その後、「試してみる」リクエストが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

答えが尋ねられた質問と一致するかどうか疑問です。
ビシュラント

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にリダイレクトされますが、受け取ったアクセストークンをどのように使用できますか?
ナディーン

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.