我试图表明身份验证/安全方案需要按如下方式设置标头:
Authorization: Bearer <token>
这是我基于swagger documentation:
的内容securityDefinitions:
APIKey:
type: apiKey
name: Authorization
in: header
security:
- APIKey: []
答案 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现在支持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": {}},
*},