The specifics of adding a header to an api call with the swagger codegen client in python is unclear

Indicate the desired document, tutorial or example showing how to add a specific authentication token to a specific header in the created Swagger API in Python?

Here is what I tried:
My API works fine with the right curl command:

curl -v -H 'X-CAG-Authorization: AG_CONSUMER_TOKEN access-key=31337-70k3n' \ 'https://api.company.net/api/v1/user/detail?user=1' * Trying 10.10.1.10... * Connected to api.company.net (10.10.1.10) port 443 (#0) * TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 * Server certificate: *.company.net * Server certificate: COMODO RSA Organization Validation Secure Server CA * Server certificate: COMODO RSA Certification Authority > GET /api/v1/user/detail?user=1 HTTP/1.1 > Host: api.company.net > User-Agent: curl/7.49.1 > Accept: */* > X-CAG-Authorization: AG_CONSUMER_TOKEN access-key=31337-70k3n > < HTTP/1.1 200 OK < Server: openresty < Date: Thu, 22 Dec 2016 19:46:05 GMT < Content-Type: application/json;charset=UTF-8 < Transfer-Encoding: chunked < Connection: close < Vary: Accept-Encoding < Vary: Accept-Encoding < X-UA-Compatible: IE=edge < {"successful":true,"message":"SUCCESS","body":{"… 

However, when I try to execute the same basic request in my Python client (2.7.12), I get an authorization failure, despite the fact that the token enters it into the header that will be used. More details about the correct way to use the client or how to get more details about the exact request and response will be appreciated.

 /Users/me/VEnvs/sku-grade/bin/python /Users/me/prj/code/python_client/api_example.py HEADERS: {'X-CAG-Authorization': 'AG_CONSUMER_TOKEN access-key=31337-70k3n', 'User-Agent': 'Swagger-Codegen/1.0.0/python'} Exception when calling SupplierApi->get_api_v1_user_details: (401) Reason: Unauthorized HTTP response headers: HTTPHeaderDict({'Date': 'Thu, 22 Dec 2016 21:09:30 GMT', 'Content-Length': '636', 'Content-Type': 'application/json; charset=UTF-8', 'Connection': 'keep-alive', 'Server': 'nginx'}) HTTP response body: { "code" : "PRECONDITION_FAILED", "type" : "UnauthorizedApiDeniedException", "message" : "Target API(/api/v1/user/details) is not available, you have to get a grant in advance.", "messages" : {… 

Here's the spagger api spec: swagger.yaml

 --- swagger: "2.0" info: description: "API" version: "TEMPORARY" title: "User Details" termsOfService: "http://wiki.company.net/tos" contact: name: "…" license: name: "…" host: "api.company.net" basePath: "/api/v1" tags: - name: "supplier" description: "Supplier" schemes: - "https" produces: - "application/json" paths: /user/details: get: tags: - "supplier" summary: "userDetails" operationId: "getApiV1UserDetails" consumes: - "application/json" produces: - "application/json;charset=utf-8" parameters: - name: "user" in: "query" description: "user id" required: true type: "integer" format: "Long" responses: 200: description: "OK" schema: $ref: "#/definitions/SupplierResponseOfUserDetailsDto" 401: description: "Unauthorized" 403: description: "Forbidden" 404: description: "Not Found" definitions: SupplierResponseOfUserDetailsDto: type: "object" properties: body: $ref: "#/definitions/UserDetailsDto" message: type: "string" successful: type: "boolean" UserDetailsDto: type: "object" properties: name: type: "string" 

Swagger-codegen was launched from http://editor.swagger.io/ , and I followed the api example trying to add an extra header: api_example.py

 from __future__ import print_function import time import swagger_client from swagger_client import ApiClient from swagger_client import Configuration from swagger_client.rest import ApiException from pprint import pprint # Setup the authentication token header conf = Configuration() conf.api_key_prefix = {"teamname": "AG_CONSUMER_TOKEN"} conf.api_key = { "teamname": "access-key=31337-70k3n" } conf.api_client = ApiClient(None, "X-CAG-Authorization", conf.get_api_key_with_prefix("teamname")) # create an instance of the API class api_instance = swagger_client.SupplierApi() user = 1 try: api_response = api_instance.get_api_v1_user_details(user) pprint(api_response) except ApiException as e: print("Exception when calling " "SupplierApi->get_api_v1_user_details: %s\n" % e) 

By print(self.api_client.default_headers) in supplier_api.py , I saw that the header was indeed set.

 {'X-CAG-Authorization': 'AG_CONSUMER_TOKEN access-key=31337-70k3n', 'User-Agent': 'Swagger-Codegen/1.0.0/python'} 

So, what should I change in my example to get it to pass the header and get permission just like a simple curl call does?

Update I also tried to identify it:

  security: - api_key: [] securityDefinitions: api_key: type: "apiKey" name: "X-CAG-Authorization" in: "header" 

and then install only the key:

 swagger_client.configuration.api_key['X-CAG-Authorization'] = \ 'access-key=31337-70k3n' swagger_client.configuration.api_key_prefix['X-CAG-Authorization'] = \ 'AG_CONSUMER_TOKEN' 

But this has not changed otherwise than the heading disappears from the default headings that I printed.

+5
source share
2 answers

I tried your sample code, and it looks like your headers are actually passed to the server.

You can confirm this by adding print headers to the swagger_client/rest.py file, before doing this:

 r = self.pool_manager.request(method, url, fields=query_params, preload_content=_preload_content, timeout=timeout, headers=headers) 

Are you sure there are no problems on the server side? Perhaps some headers violate authentication?

Did the following curl command work?

 curl -v \ -H 'X-CAG-Authorization: AG_CONSUMER_TOKEN access-key=31337-70k3n' \ -H 'Content-Type: application/json' \ -H 'Accept: application/json;charset=utf-8' \ -H 'User-Agent: Swagger-Codegen/1.0.0/python' \ 'https://api.company.net/api/v1/user/detail?user=1' 

Because this should give you the same answer that will return to swagger, which is 401 error. If so, you can debug from there on the server side. If this is not so, I have no idea.

+2
source

In your specification, you will need to describe a security parameter (API key in your case) similar to this example defined in securityDefinitions in the OpenAPI / Swagger specification.

Then at the endpoint you will need to “apply” a security definition similar to this example

After that, you can set the API key in the configuration.py of the auto-generated Python API client, and the HTTP request will include the API key accordingly (either in the header line or in the request line of the URL, as defined in the security parameter of the specification)

Since the last stable release of Swagger Codegen, quite a few improvements have been made to the auto-generated Python API client, so I suggest you pull out the last wizard and build a JAR locally to create the API clients.

+2
source

Source: https://habr.com/ru/post/1261744/


All Articles