我如何表示授权:承载<令牌>&#39;在Swagger规范中(swagger.json)

时间:2015-10-02 14:57:43

标签: swagger swagger-2.0 swagger-editor

我试图表明身份验证/安全方案需要按如下方式设置标头:

Authorization: Bearer <token>

这是我基于swagger documentation

的内容
securityDefinitions:
  APIKey:
    type: apiKey
    name: Authorization
    in: header
security:
  - APIKey: []

7 个答案:

答案 0 :(得分:109)

也许这会有所帮助:

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编辑器网站中还有一些示例,其中包含更复杂的安全配置,可以为您提供帮助。

答案 1 :(得分:28)

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
  }
})

答案 2 :(得分:15)

为什么&#34;接受的答案&#34;工作...但它对我来说还不够

这适用于规范。至少swagger-tools(版本0.10.1)将其验证为有效。

但是如果你使用其他工具如swagger-codegen(版本2.1.6),你会发现一些困难,即使生成的客户端包含身份验证定义,如下所示:

this.authentications = {
  'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};

在调用方法(端点)之前,无法将标记传递到标头中。查看此函数签名:

this.rootGet = function(callback) { ... }

这意味着,我只会在没有令牌的情况下传递回调(在其他情况下是查询参数等),从而导致对服务器的请求构建不正确。

我的替代

不幸的是,它并不是很漂亮的&#34;但它一直有效,直到我在Swagger上获得JWT Tokens支持。

注意:正在讨论

因此,它像标准标题一样处理身份验证。在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
  };
  // ...
}

要以正确的方式使用此方法,只需传递&#34;完整字符串&#34;

// 'token' and 'cb' comes from elsewhere
var header = 'Bearer ' + token;
sdk.rootGet(header, cb);

并且有效。

答案 3 :(得分:6)

使用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"
      }
    }
  }
}

答案 4 :(得分: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

}

答案 5 :(得分:0)

通过使用requestInterceptor,它对我有用:

const ui = SwaggerUIBundle({
  ...
  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer " + req.headers.Authorization;
    return req;
  },
  ...
});

答案 6 :(得分:0)

从 laravel 7x ("openapi": "3.0.0") 解决此问题,使用以下代码编辑您的 config\l5-swagger.php

'securityDefinitions' => [
                'securitySchemes' => [
                    'bearerAuth' => [ 
                        'type' => 'http',
                        'scheme' => 'bearer',
                        'bearerFormat' => 'JWT', 
                    ], 
                ],

然后您可以将其添加为端点的安全注释:

*security={
     *{
     *"bearerAuth": {}},
     *},