如何在由Swagger Codegen 3.x生成的Python API客户端中设置Bearer令牌?

6

我使用在线Swagger Codegen在https://generator.swagger.io/生成了一个Python客户端库,用于调用此API。该API使用Bearer认证。

openapi: 3.0.0
...

paths:
  /sandbox/register:
    post:
      ...
      security:
        - sso_auth: []
      ...

components:
  securitySchemes:
    sso_auth:
      type: http
      scheme: bearer

然而,生成的 Python 客户端中的 Configuration 类没有 access_token 字段。
在使用生成的客户端库时如何填写 Bearer 访问令牌?
codegen 端点 POST /gen/clients/{language} 具有 authorizationValue 和 securityDefinition 参数 - 我需要以某种方式配置这些参数吗?
"authorizationValue": {
  "value": "string",
  "type": "string",
  "keyName": "string"
},
"securityDefinition": {
  "type": "string",
  "description": "string"
}

请发布您的OpenAPI YAML/JSON文件。 - Helen
3个回答

11
首先,因为你的API是OpenAPI 3.0,所以你需要使用Swagger Codegen 3.x,即https://generator3.swagger.ioswagger-codegen-cli-3.0.11.jar。在https://generator.swagger.io上的生成器适用于OpenAPI 2.0 (swagger: '2.0')。
也就是说,在Swagger Codegen 3.x的Python生成器中存在一个错误,它不会为OpenAPI 3.0定义中的Bearer身份验证生成代码。请在https://github.com/swagger-api/swagger-codegen-generators/issues上报告错误。 /gen/clientsauthorizationValuesecurityDefinition参数与OpenAPI文件中的安全定义无关。
作为解决方法,请编辑您的OpenAPI YAML文件并替换此部分。
  securitySchemes:
    sso_auth:
      type: http
      scheme: bearer

使用:

  securitySchemes:
    sso_auth:
      type: apiKey
      in: header
      name: Authorization

然后从修改后的API定义生成一个新的Python客户端。

现在,一旦按照README.md中所述安装了客户端包,你应该能够按照以下方式设置令牌:

import swagger_client
...

# Configure API key authorization: sso_auth
configuration = swagger_client.Configuration()
configuration.api_key['Authorization'] = 'YOUR_BEARER_TOKEN'
configuration.api_key_prefix['Authorization'] = 'Bearer'

# create an instance of the API class
api_instance = swagger_client.MarketApi(swagger_client.ApiClient(configuration))
...

嘿,你知道那还是现状吗?谢谢。 - 4c74356b41
我找到了这个链接:https://github.com/OpenAPITools/openapi-generator/issues/1577 - 4c74356b41

1
在我的情况下,我可以像这样简单地设置Configuration对象的access_token
configuration = Configuration()
configuration.verify_ssl = ...
configuration.host = ...
configuration.access_token = token

以下信息来自此处,架构由fastapi生成。

在这里输入图片描述


0

另一种方法是使用承载者安全方案,如下所示:

openapi-definition.json

{
  "openapi": "3.0.1",
  ...
  "components": {
    "securitySchemes": {
      "bearerAuth": {
        "type": "http",
        "scheme": "bearer",
        "bearerFormat": "JWT"
      }
    }
  },
  "security": [
    {"bearerAuth":  []}
  ]

Python客户端

import swagger_client
...

# Configure API authorization
configuration = swagger_client.Configuration()
configuration.access_token = 'YOUR_BEARER_TOKEN'

# create an instance of the API class
api_instance = swagger_client.AnApi(swagger_client.ApiClient(configuration))
...

已使用OpenApi 3.0.1进行测试

文档:https://swagger.io/docs/specification/authentication/bearer-authentication/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接