如何表示“授权:在< token>Swagger规范(swagger.json)中的不记名

ubof19bj  于 2022-11-23  发布在  其他
关注(0)|答案(7)|浏览(179)

我试图传达认证/安全方案需要如下设置报头:

Authorization: Bearer <token>

这是我根据swagger文档所得到的结果:

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

xhv8bpkk1#

也许这能帮上忙:

swagger: '2.0'
info:
  version: 1.0.0
  title: Bearer auth example
  description: >
    An example for how to use Bearer Auth with OpenAPI / Swagger 2.0.

host: basic-auth-server.herokuapp.com
schemes:
  - http
  - https
securityDefinitions:
  Bearer:
    type: apiKey
    name: Authorization
    in: header
    description: >-
      Enter the token with the `Bearer: ` prefix, e.g. "Bearer abcde12345".
paths:
  /:
    get:
      security:
        - Bearer: []
      responses:
        '200':
          description: 'Will send `Authenticated`'
        '403': 
          description: 'You do not have necessary permissions for the resource'

您可以将其复制并粘贴到https://editor.swagger.io以查看结果。
在Swagger编辑器网站中也有几个具有更复杂安全配置的示例,可以帮助您。

**重要事项:**在此示例中,API使用者必须将“Bearer”前缀作为标记值的一部分。例如,使用Swagger UI的“Authorize”对话框时,需要输入Bearer your_token,而不仅仅是your_token

f4t66c6m

f4t66c6m2#

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将显示“Authorize”按钮,您可以单击该按钮并输入不记名令牌(仅令牌本身,没有“Bearer“前缀)。之后,“try it out”请求将使用Authorization: Bearer xxxxxx报头发送。

以编程方式添加Authorization标题(Swagger UI 3.x)

如果您使用Swagger UI,并且由于某种原因,需要以编程方式添加Authorization头,而不是让用户单击“Authorize”并输入令牌,则可以使用requestInterceptor。UI 2.x使用了不同的技术。

// index.html

const ui = SwaggerUIBundle({
  url: "http://your.server.com/swagger.json",
  ...

  requestInterceptor: (req) => {
    req.headers.Authorization = "Bearer xxxxxxx"
    return req
  }
})
uubf1zoe

uubf1zoe3#

使用openapi 3.0.0以JSON格式发布2022年的答案:

{
  "openapi": "3.0.0",
  ...
  "servers": [
    {
      "url": "/"
    }
  ],
  ...
  "paths": {
    "/skills": {
      "put": {
        "security": [
           {
              "bearerAuth": []
           }
        ],
       ...
  },

  "components": {        
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  }
}
6xfqseft

6xfqseft4#

"为什么“接受答案”有用...但对我来说还不够"
至少swagger-tools(版本0.10.1)将其验证为有效的。
但是如果您使用其他工具,如swagger-codegen(版本2.1.6),您会发现一些困难,即使生成的客户端包含Authentication定义,如下所示:

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

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

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

这意味着,我只传递回调(在其他情况下是查询参数等)而不传递令牌,这会导致向服务器发送的请求的构建不正确。
"我的选择"
不幸的是,它并不“漂亮”,但它的工作,直到我得到JWT令牌支持的Swagger。
注:中讨论的

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

要以正确的方式使用此方法,只需将“full string”

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

而且很管用。

xfyts7mz

xfyts7mz5#

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

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

shstlldc6#

我的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

}

66bbxpm5

66bbxpm57#

通过laravel 7 x(“openapi”:“3.0.0”),使用以下代码编辑config\l5-swagger.php

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

则可以将其添加为端点安全注解:

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

相关问题