Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
21 commits
Select commit Hold shift + click to select a range
2b80b8a
[python] Support aliasing of API keys
jirikuncar May 28, 2020
1b4250c
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 2, 2020
93a7223
Support for aliasing and prefix
jirikuncar Jun 2, 2020
7ae3dc6
Make more realistic usage
jirikuncar Jun 2, 2020
5b8f65f
Regenerate
jirikuncar Jun 2, 2020
0637df2
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 3, 2020
116fa25
Document alias in generated code
jirikuncar Jun 3, 2020
eb6557e
Support override of aliased keys
jirikuncar Jun 3, 2020
49a4c3d
Use diferent id and name for api keys
jirikuncar Jun 3, 2020
185650a
ensure up-to-date
jirikuncar Jun 3, 2020
c5710b7
Simple example without x-auth-id-alias
jirikuncar Jun 3, 2020
899e1f4
regenerate docs
jirikuncar Jun 3, 2020
12e4f9d
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 4, 2020
b2d82c1
Regenerate
jirikuncar Jun 4, 2020
ea2706d
Provide separate spec for x-auth-id-alias
jirikuncar Jun 4, 2020
e8cdc89
Apply suggestions from code review
jirikuncar Jun 4, 2020
3d5f7b7
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 5, 2020
e770aad
regenerated
jirikuncar Jun 5, 2020
5527702
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 5, 2020
2502a2c
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 8, 2020
a7a9183
Merge remote-tracking branch 'upstream/master' into jirikuncar/python…
jirikuncar Jun 11, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions bin/configs/python-experimental-extensions-x-auth-alias.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
generatorName: python-experimental
outputDir: samples/openapi3/client/extensions/x-auth-id-alias/python-experimental/
inputSpec: modules/openapi-generator/src/test/resources/3_0/extensions/x-auth-id-alias.yaml
templateDir: modules/openapi-generator/src/main/resources/python
additionalProperties:
packageName: x_auth_id_alias
Original file line number Diff line number Diff line change
Expand Up @@ -423,15 +423,16 @@ conf = {{{packageName}}}.Configuration(
self.__logger_format = value
self.logger_formatter = logging.Formatter(self.__logger_format)

def get_api_key_with_prefix(self, identifier):
def get_api_key_with_prefix(self, identifier, alias=None):
"""Gets API key (with prefix if set).

:param identifier: The identifier of apiKey.
:param alias: The alternative identifier of apiKey.
:return: The token for api key authentication.
"""
if self.refresh_api_key_hook is not None:
self.refresh_api_key_hook(self)
key = self.api_key.get(identifier)
key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
if key:
prefix = self.api_key_prefix.get(identifier)
if prefix:
Expand Down Expand Up @@ -462,12 +463,15 @@ conf = {{{packageName}}}.Configuration(
auth = {}
{{#authMethods}}
{{#isApiKey}}
if '{{keyParamName}}' in self.api_key:
if '{{name}}' in self.api_key{{#vendorExtensions.x-auth-id-alias}} or '{{.}}' in self.api_key{{/vendorExtensions.x-auth-id-alias}}:
auth['{{name}}'] = {
'type': 'api_key',
'in': {{#isKeyInCookie}}'cookie'{{/isKeyInCookie}}{{#isKeyInHeader}}'header'{{/isKeyInHeader}}{{#isKeyInQuery}}'query'{{/isKeyInQuery}},
'key': '{{keyParamName}}',
'value': self.get_api_key_with_prefix('{{keyParamName}}')
'value': self.get_api_key_with_prefix(
'{{name}}',{{#vendorExtensions.x-auth-id-alias}}
alias='{{.}}',{{/vendorExtensions.x-auth-id-alias}}
),
}
{{/isApiKey}}
{{#isBasic}}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,11 +95,11 @@ configuration = {{{packageName}}}.Configuration(
configuration = {{{packageName}}}.Configuration(
host = "{{{basePath}}}",
api_key = {
'{{{keyParamName}}}': 'YOUR_API_KEY'
'{{name}}': 'YOUR_API_KEY'
}
)
# Uncomment below to setup prefix (e.g. Bearer) for API key, if needed
# configuration.api_key_prefix['{{{keyParamName}}}'] = 'Bearer'
# configuration.api_key_prefix['{{name}}'] = 'Bearer'
{{/isApiKey}}
{{#isOAuth}}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
openapi: 3.0.0
info:
description: This specification shows how to use x-auth-id-alias extension for API keys.
version: 1.0.0
title: OpenAPI Extension x-auth-id-alias
license:
name: Apache-2.0
url: 'https://www.apache.org/licenses/LICENSE-2.0.html'
tags:
- name: usage
description: Show usage of x-auth-id-alias
components:
securitySchemes:
api_key:
type: apiKey
name: X-Api-Key
in: header
api_key_query:
type: apiKey
name: api_key
# Test key aliasing
x-auth-id-alias: api_key
in: query
paths:
/both:
get:
tags:
- usage
summary: Use both API keys
description: Use both API keys
operationId: bothKeys
security:
- api_key_query: []
api_key: []
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
/any:
get:
tags:
- usage
summary: Use any API key
description: Use any API key
operationId: anyKey
security:
- api_key_query: []
- api_key: []
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
/query:
get:
tags:
- usage
summary: Use API key in query
description: Use API key in query
operationId: keyInQuery
security:
- api_key_query: []
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
/header:
get:
tags:
- usage
summary: Use API key in header
description: Use API key in header
operationId: keyInHeader
security:
- api_key: []
responses:
'200':
description: successful operation
content:
application/json:
schema:
type: object
servers:
- url: 'http://{server}.swagger.io:{port}/v2'
description: petstore server
variables:
server:
enum:
- 'petstore'
- 'qa-petstore'
- 'dev-petstore'
default: 'petstore'
port:
enum:
- 80
- 8080
default: 80
- url: https://localhost:8080/{version}
description: The local server
variables:
version:
enum:
- 'v1'
- 'v2'
default: 'v2'
Original file line number Diff line number Diff line change
Expand Up @@ -341,15 +341,16 @@ def logger_format(self, value):
self.__logger_format = value
self.logger_formatter = logging.Formatter(self.__logger_format)

def get_api_key_with_prefix(self, identifier):
def get_api_key_with_prefix(self, identifier, alias=None):
"""Gets API key (with prefix if set).

:param identifier: The identifier of apiKey.
:param alias: The alternative identifier of apiKey.
:return: The token for api key authentication.
"""
if self.refresh_api_key_hook is not None:
self.refresh_api_key_hook(self)
key = self.api_key.get(identifier)
key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
if key:
prefix = self.api_key_prefix.get(identifier)
if prefix:
Expand Down Expand Up @@ -383,14 +384,18 @@ def auth_settings(self):
'type': 'api_key',
'in': 'header',
'key': 'api_key',
'value': self.get_api_key_with_prefix('api_key')
'value': self.get_api_key_with_prefix(
'api_key',
),
}
if 'api_key_query' in self.api_key:
auth['api_key_query'] = {
'type': 'api_key',
'in': 'query',
'key': 'api_key_query',
'value': self.get_api_key_with_prefix('api_key_query')
'value': self.get_api_key_with_prefix(
'api_key_query',
),
}
if self.username is not None and self.password is not None:
auth['http_basic_test'] = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,15 +345,16 @@ def logger_format(self, value):
self.__logger_format = value
self.logger_formatter = logging.Formatter(self.__logger_format)

def get_api_key_with_prefix(self, identifier):
def get_api_key_with_prefix(self, identifier, alias=None):
"""Gets API key (with prefix if set).

:param identifier: The identifier of apiKey.
:param alias: The alternative identifier of apiKey.
:return: The token for api key authentication.
"""
if self.refresh_api_key_hook is not None:
self.refresh_api_key_hook(self)
key = self.api_key.get(identifier)
key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
if key:
prefix = self.api_key_prefix.get(identifier)
if prefix:
Expand Down Expand Up @@ -387,14 +388,18 @@ def auth_settings(self):
'type': 'api_key',
'in': 'header',
'key': 'api_key',
'value': self.get_api_key_with_prefix('api_key')
'value': self.get_api_key_with_prefix(
'api_key',
),
}
if 'api_key_query' in self.api_key:
auth['api_key_query'] = {
'type': 'api_key',
'in': 'query',
'key': 'api_key_query',
'value': self.get_api_key_with_prefix('api_key_query')
'value': self.get_api_key_with_prefix(
'api_key_query',
),
}
if self.username is not None and self.password is not None:
auth['http_basic_test'] = {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -345,15 +345,16 @@ def logger_format(self, value):
self.__logger_format = value
self.logger_formatter = logging.Formatter(self.__logger_format)

def get_api_key_with_prefix(self, identifier):
def get_api_key_with_prefix(self, identifier, alias=None):
"""Gets API key (with prefix if set).

:param identifier: The identifier of apiKey.
:param alias: The alternative identifier of apiKey.
:return: The token for api key authentication.
"""
if self.refresh_api_key_hook is not None:
self.refresh_api_key_hook(self)
key = self.api_key.get(identifier)
key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
if key:
prefix = self.api_key_prefix.get(identifier)
if prefix:
Expand Down Expand Up @@ -387,14 +388,18 @@ def auth_settings(self):
'type': 'api_key',
'in': 'header',
'key': 'api_key',
'value': self.get_api_key_with_prefix('api_key')
'value': self.get_api_key_with_prefix(
'api_key',
),
}
if 'api_key_query' in self.api_key:
auth['api_key_query'] = {
'type': 'api_key',
'in': 'query',
'key': 'api_key_query',
'value': self.get_api_key_with_prefix('api_key_query')
'value': self.get_api_key_with_prefix(
'api_key_query',
),
}
if self.username is not None and self.password is not None:
auth['http_basic_test'] = {
Expand Down
13 changes: 9 additions & 4 deletions samples/client/petstore/python/petstore_api/configuration.py
Original file line number Diff line number Diff line change
Expand Up @@ -345,15 +345,16 @@ def logger_format(self, value):
self.__logger_format = value
self.logger_formatter = logging.Formatter(self.__logger_format)

def get_api_key_with_prefix(self, identifier):
def get_api_key_with_prefix(self, identifier, alias=None):
"""Gets API key (with prefix if set).

:param identifier: The identifier of apiKey.
:param alias: The alternative identifier of apiKey.
:return: The token for api key authentication.
"""
if self.refresh_api_key_hook is not None:
self.refresh_api_key_hook(self)
key = self.api_key.get(identifier)
key = self.api_key.get(identifier, self.api_key.get(alias) if alias is not None else None)
if key:
prefix = self.api_key_prefix.get(identifier)
if prefix:
Expand Down Expand Up @@ -387,14 +388,18 @@ def auth_settings(self):
'type': 'api_key',
'in': 'header',
'key': 'api_key',
'value': self.get_api_key_with_prefix('api_key')
'value': self.get_api_key_with_prefix(
'api_key',
),
}
if 'api_key_query' in self.api_key:
auth['api_key_query'] = {
'type': 'api_key',
'in': 'query',
'key': 'api_key_query',
'value': self.get_api_key_with_prefix('api_key_query')
'value': self.get_api_key_with_prefix(
'api_key_query',
),
}
if self.username is not None and self.password is not None:
auth['http_basic_test'] = {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
venv/
.venv/
.python-version
.pytest_cache

# Translations
*.mo
*.pot

# Django stuff:
*.log

# Sphinx documentation
docs/_build/

# PyBuilder
target/

#Ipython Notebook
.ipynb_checkpoints
Loading