我如何表示';授权:持票人<;代币>';在Swagger规范(Swagger.json)中
我试图传达身份验证/安全方案需要设置如下标题:我如何表示';授权:持票人<;代币>';在Swagger规范(Swagger.json)中,swagger,swagger-2.0,swagger-editor,Swagger,Swagger 2.0,Swagger Editor,我试图传达身份验证/安全方案需要设置如下标题: Authorization: Bearer <token> 也许这会有帮助: 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
Authorization: Bearer <token>
也许这会有帮助:
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'
您可以将其复制并粘贴到此处:以查看结果
在swagger editor web中还有几个例子,其中包含更复杂的安全配置,可以帮助您。为什么“接受答案”有效。。。但这对我来说还不够
这在规范中起作用。至少swagger tools
(版本0.10.1)将其验证为有效的
但是,如果您正在使用其他工具,如swagger codegen
(版本2.1.6),您将发现一些困难,即使生成的客户端包含身份验证定义,如下所示:
this.authentications = {
'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};
在调用方法(端点)之前,无法将令牌传递到头中。查看此函数签名:
this.rootGet = function(callback) { ... }
this.rootGet = function(authorization, callback) {
// ...
var headerParams = {
'authorization': authorization
};
// ...
}
这意味着,我只传递回调(在其他情况下是查询参数等),而不传递令牌,这会导致向服务器生成错误的请求
我的选择
不幸的是,它并不“漂亮”,但在我获得JWT Tokens对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(callback) { ... }
this.rootGet = function(authorization, callback) {
// ...
var headerParams = {
'authorization': authorization
};
// ...
}
要正确使用此方法,只需传递“完整字符串”
并且有效。OpenAPI 3.0.0中的承载身份验证
现在本机支持承载/JWT身份验证。它的定义如下:
this.authentications = {
'Bearer': {type: 'apiKey', 'in': 'header', name: 'Authorization'}
};
openapi:3.0.0
...
组件:
证券计划:
BeareAuth:
类型:http
方案:持票人
BearPerformat:JWT#可选,仅用于文档编制
安全:
-BeareAuth:[]
这在Swagger UI 3.4.0+和Swagger Editor 3.1.12+中受支持(同样,仅适用于OpenAPI 3.0规范!)
UI将显示“授权”按钮,您可以单击该按钮并输入承载令牌(仅令牌本身,不带“承载”前缀)。之后,“试用”请求将通过授权:Bearer xxxxxx
头发送
以编程方式添加授权
标题(Swagger UI 3.x)
如果您使用Swagger UI,并且出于某种原因需要以编程方式添加授权
标题,而不是让用户单击“授权”并输入令牌,则可以使用请求拦截器
。此解决方案适用于Swagger UI 3.x;UI2.x使用了不同的技术
//index.html
const ui=SwaggerUIBundle({
url:“http://your.server.com/swagger.json",
...
请求侦听器:(请求)=>{
req.headers.Authorization=“持有人xxxxxxx”
返回请求
}
})
使用openapi 3.0.0以JSON发布2021答案:
{
“openapi”:“3.0.0”,
...
“服务器”:[
{
“url”:“/”
}
],
...
“路径”:{
“/技能”:{
“付诸表决”:{
“安全”:[
{
“BeareAuth”:[]
}
],
...
},
“组成部分”:{
“担保计划”:{
“bearerAuth”:{
“类型”:“http”,
“方案”:“持票人”,
“BearPerformat”:“JWT”
}
}
}
}
我的黑客解决方法是修改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({
...
请求侦听器:(请求)=>{
req.headers.Authorization=“承载人”+req.headers.Authorization;
返回请求;
},
...
});
我不明白你如何告诉编辑发送什么用户和密码或基本令牌才能获得200。我是不是遗漏了什么?好的,没关系。显然“身份验证”是你可以单击以获得登录表单的东西。@goblins your wantcurl-X get-H“授权:承载你的令牌”
,其中您的_令牌
是您的承载令牌。例如curl-X GET-H“Accept:application/json“-H”授权:承载00000000-0000-0000-00000000000000”http://localhost/secure-endpoint“
不幸的是,这不适用于Swagger UI-单击“授权”并提供裸令牌将生成“试用”使用-H“Authorization:foo”而不是-H“Authorization:foo”的curl示例
与OpenAPI 3 Answer类似,我的解决方法是将Bear xxxxxxxx作为UI授权框中的密钥。这是可行的,但缺点是告诉用户手动输入Bear,然后输入密钥。或者,您可以修改返回API密钥的函数/方法,将Bear前缀作为密钥的一部分。我如何导入这是在flask restplus生成的招摇过市文档中吗?我怀疑答案是否与所问的问题一致。通过这样做,我没有得到任何路由匹配错误“令牌来自其他地方”…我对“别处”很感兴趣。当您登录时被定向到您的登录并重定向到您的swagger api时,您如何使用您收到的访问令牌?工作起来很有魅力:-)