我怎样才能代表’授权: 承载者 < 令牌 >’在一个斯威格规格(斯威格.json)

我想表达的意思是,认证/保安方案需要设置标题如下:

Authorization: Bearer <token>

这是我根据 虚张声势的文件得出的结论:

securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
248810 次浏览

也许这个能帮上忙:

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 Editor web 中也有一些例子,它们具有更复杂的安全配置,可以帮助您。

重要提示: 在这个示例中,API 使用者必须包含“ Bearer”前缀作为令牌值的一部分。例如,当使用 Swagger UI 的“ Authorize”对话框时,您需要输入 Bearer your_token而不仅仅是 your_token

Swagger UI's Authorization dialog

为什么“接受的答案”有用... 但对我来说还不够

这在规范中起作用。至少 swagger-tools(版本0.10.1)验证它是有效的。

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

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

在调用方法(端点)之前,无法将标记传递到头部:

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

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

我的选择

不幸的是,它并不“漂亮”,但在我得到 JWT Token 对 Swagger 的支持之前,它是有效的。

注意: 正在讨论中

因此,它像一个标准的头文件一样处理身份验证:

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

而且很有效。

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”按钮,您可以单击并输入持有者令牌(只是令牌本身,没有“持有者”前缀)。之后,“ try it out”请求将与 Authorization: Bearer xxxxxx头一起发送。

以编程方式添加 Authorization头文件(Swagger UI 3.x)

如果您使用的是 Swagger UI,并且由于某种原因需要以编程方式添加 Authorization头文件,而不是让用户单击“ Authorize”并输入令牌,那么您可以使用 requestInterceptor。这个解决方案适用于 斯威格 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
}
})

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

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

}

通过使用 requestInterceptor,它为我工作:

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

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

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

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

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