我如何表示';授权:持票人<;代币>';在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 want
curl-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时,您如何使用您收到的访问令牌?工作起来很有魅力:-)