描述问题
最近几天我一直在努力弄清楚如何在 openapi、swagger、connexion 中使用 apikey 安全性来进行基于角色的令牌身份验证。以下 OpenAPI 3.0 端点定义:
/lab/samples/list:
get:
tags:
- lab
summary: get a list of all registered samples
operationId: list_samples
responses:
"200":
description: successfully returned all available samples and their notification status
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Sample-For-Lab'
x-content-type: application/json
"400":
description: invalid request
content:
application/json:
schema:
$ref: '#/components/schemas/inline_response'
security:
- bearerAuth: ['labuser']
具有相应的安全定义
securitySchemes:
bearerAuth:
type: apiKey
name: Authorization
in: header
x-apikeyInfoFunc: swagger_server.controllers.authorization_controller.check_bearerAuth
到目前为止,一切都很好。我使用 swagger-codegen 构建了相应的服务器存根,它遵循连接安全模型并提供两个字段,api_key
即承载令牌和“required_scopes”,即应该包含“labuser”。访问端点时,会调用控制器函数:
def check_adminuserAuth(api_key, required_scopes):
return {'sample_key' : 'sample_value}
在正确传递不记名令牌时,required_scopes
是None
. 因此,无法实际验证提供的令牌中显示的凭据和权限是否与labuser
授权控制器中端点所需的范围相匹配。我考虑过在被调用的端点中处理验证,list_systemusers()
但连接没有传递令牌。
OpenAPI 3.0 不支持
经过一番挖掘,我发现 OpenAPI 3.0 在全局 API 级别(即是否经过身份验证)提供 apiKey 验证,但不支持每个端点的单个范围。如果您想要单独的范围,则需要切换到 OAuth 安全性。然而,通过 apiKey 安全性对安全范围的支持将在 OpenAPI 3.1 中提供