0

描述问题

最近几天我一直在努力弄清楚如何在 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_scopesNone. 因此,无法实际验证提供的令牌中显示的凭据和权限是否与labuser授权控制器中端点所需的范围相匹配。我考虑过在被调用的端点中处理验证,list_systemusers()但连接没有传递令牌。

OpenAPI 3.0 不支持

经过一番挖掘,我发现 OpenAPI 3.0 在全局 API 级别(即是否经过身份验证)提供 apiKey 验证,但不支持每个端点的单个范围。如果您想要单独的范围,则需要切换到 OAuth 安全性。然而,通过 apiKey 安全性对安全范围的支持将在 OpenAPI 3.1 中提供

4

1 回答 1

0

解决方法

因此,目前使单个作用域的不记名令牌安全工作的唯一方法是为每个作用域实际定义一个安全方案,例如

securitySchemes:
    adminuserAuth:
      type: apiKey
      description: Provide your bearer token in the format **Bearer <token>**
      name: Authorization
      in: header
      x-apikeyInfoFunc: swagger_server.controllers.authorization_controller.check_adminuserAuth
    statsuserAuth:
      type: apiKey
      description: Provide your bearer token in the format **Bearer <token>**
      name: Authorization
      in: header
      x-apikeyInfoFunc: swagger_server.controllers.authorization_controller.check_statsuserAuth
    labuserAuth:
      type: apiKey
      description: Provide your bearer token in the format **Bearer <token>** 
      name: Authorization
      in: header
      x-apikeyInfoFunc: swagger_server.controllers.authorization_controller.check_labuserAuth

然后在路径定义上添加您所需的安全身份验证方案

security:
- labuserAuth: []
- adminuserAuth: []
x-openapi-router-controller: swagger_server.controllers.lab_controller

现在我知道哪个授权控制器方法被称为用户需要显示的所需范围,因此可以根据令牌中显示的方法对其进行验证。

于 2020-09-20T09:43:18.947 回答