Browse Source

chore: Merge branch 'master' into hotfix/group-not-found

pull/676/head
Richard Nemeth 4 weeks ago
parent
commit
43e06c3e21
No known key found for this signature in database GPG Key ID: 21C39470DF3DEC39
  1. 2
      .github/workflows/daily.yaml
  2. 8
      .github/workflows/lint.yaml
  3. 2
      .github/workflows/publish.yaml
  4. 2
      .readthedocs.yaml
  5. 6
      CHANGELOG.md
  6. 4
      docs/source/modules/admin.rst
  7. 3
      docs/source/modules/openid_client.rst
  8. 2021
      poetry.lock
  9. 5
      pyproject.toml
  10. 35
      src/keycloak/connection.py
  11. 10
      src/keycloak/keycloak_admin.py
  12. 7
      src/keycloak/keycloak_openid.py
  13. 4
      src/keycloak/openid_connection.py
  14. 26
      tests/test_keycloak_admin.py
  15. 13
      tests/test_keycloak_openid.py

2
.github/workflows/daily.yaml

@ -10,7 +10,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
keycloak-version: ["22.0", "23.0", "24.0", "25.0", "26.0", "latest"] keycloak-version: ["22.0", "23.0", "24.0", "25.0", "26.0", "latest"]
env: env:
KEYCLOAK_DOCKER_IMAGE_TAG: ${{ matrix.keycloak-version }} KEYCLOAK_DOCKER_IMAGE_TAG: ${{ matrix.keycloak-version }}

8
.github/workflows/lint.yaml

@ -20,7 +20,7 @@ jobs:
- name: Set up Python 3.13 - name: Set up Python 3.13
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: "3.13"
python-version: "3.14"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
@ -40,7 +40,7 @@ jobs:
- name: Set up Python 3.13 - name: Set up Python 3.13
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: "3.13"
python-version: "3.14"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip
@ -55,7 +55,7 @@ jobs:
strategy: strategy:
fail-fast: false fail-fast: false
matrix: matrix:
python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"]
python-version: ["3.10", "3.11", "3.12", "3.13", "3.14"]
keycloak-version: ["22.0", "23.0", "24.0", "25.0", "26.0", "latest"] keycloak-version: ["22.0", "23.0", "24.0", "25.0", "26.0", "latest"]
needs: needs:
- check-commits - check-commits
@ -91,7 +91,7 @@ jobs:
- name: Set up Python 3.13 - name: Set up Python 3.13
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: "3.13"
python-version: "3.14"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip

2
.github/workflows/publish.yaml

@ -15,7 +15,7 @@ jobs:
- name: Set up Python 3.13 - name: Set up Python 3.13
uses: actions/setup-python@v5 uses: actions/setup-python@v5
with: with:
python-version: "3.13"
python-version: "3.14"
- name: Install dependencies - name: Install dependencies
run: | run: |
python -m pip install --upgrade pip python -m pip install --upgrade pip

2
.readthedocs.yaml

@ -6,7 +6,7 @@ sphinx:
build: build:
os: "ubuntu-24.04" os: "ubuntu-24.04"
tools: tools:
python: "3.13"
python: "3.14"
jobs: jobs:
post_create_environment: post_create_environment:
- python -m pip install poetry - python -m pip install poetry

6
CHANGELOG.md

@ -1,3 +1,9 @@
## v5.9.0 (2025-12-27)
### Feat
- add pool_maxsize parameter to connection managers (#651)
## v5.8.1 (2025-08-19) ## v5.8.1 (2025-08-19)
### Fix ### Fix

4
docs/source/modules/admin.rst

@ -15,7 +15,8 @@ Configure admin client
username='example-admin', username='example-admin',
password='secret', password='secret',
realm_name="master", realm_name="master",
user_realm_name="only_if_other_realm_than_master")
user_realm_name="only_if_other_realm_than_master",
pool_maxsize=20)
Configure admin client with connection Configure admin client with connection
@ -34,6 +35,7 @@ Configure admin client with connection
user_realm_name="only_if_other_realm_than_master", user_realm_name="only_if_other_realm_than_master",
client_id="my_client", client_id="my_client",
client_secret_key="client-secret", client_secret_key="client-secret",
pool_maxsize=25,
verify=True) verify=True)
keycloak_admin = KeycloakAdmin(connection=keycloak_connection) keycloak_admin = KeycloakAdmin(connection=keycloak_connection)

3
docs/source/modules/openid_client.rst

@ -16,7 +16,8 @@ Configure client OpenID
keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/", keycloak_openid = KeycloakOpenID(server_url="http://localhost:8080/",
client_id="example_client", client_id="example_client",
realm_name="example_realm", realm_name="example_realm",
client_secret_key="secret")
client_secret_key="secret",
pool_maxsize=15) # Example: Set connection pool size
Get .well_know Get .well_know

2021
poetry.lock
File diff suppressed because it is too large
View File

5
pyproject.toml

@ -65,10 +65,7 @@ twine = ">=4.0.2"
freezegun = ">=1.2.2" freezegun = ">=1.2.2"
docutils = "<0.21" docutils = "<0.21"
ruff = ">=0.9.3" ruff = ">=0.9.3"
[[tool.poetry.source]]
name = "PyPI"
priority = "primary"
backports-asyncio-runner = { "version" = ">=1.2.0", "python" = ">=3.9,<3.11" }
[build-system] [build-system]
requires = ["poetry-core>=1.0.0"] requires = ["poetry-core>=1.0.0"]

35
src/keycloak/connection.py

@ -59,6 +59,8 @@ class ConnectionManager:
:type cert: Union[str,Tuple[str,str]] :type cert: Union[str,Tuple[str,str]]
:param max_retries: The total number of times to retry HTTP requests. :param max_retries: The total number of times to retry HTTP requests.
:type max_retries: int :type max_retries: int
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
def __init__( def __init__(
@ -70,6 +72,7 @@ class ConnectionManager:
proxies: dict | None = None, proxies: dict | None = None,
cert: str | tuple | None = None, cert: str | tuple | None = None,
max_retries: int = 1, max_retries: int = 1,
pool_maxsize: int | None = None,
) -> None: ) -> None:
""" """
Init method. Init method.
@ -91,19 +94,25 @@ class ConnectionManager:
:type cert: Union[str,Tuple[str,str]] :type cert: Union[str,Tuple[str,str]]
:param max_retries: The total number of times to retry HTTP requests. :param max_retries: The total number of times to retry HTTP requests.
:type max_retries: int :type max_retries: int
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
self.base_url = base_url self.base_url = base_url
self.headers = headers self.headers = headers
self.timeout = timeout self.timeout = timeout
self.verify = verify self.verify = verify
self.cert = cert self.cert = cert
self.pool_maxsize = pool_maxsize
self._s = requests.Session() self._s = requests.Session()
self._s.auth = lambda x: x # don't let requests add auth headers self._s.auth = lambda x: x # don't let requests add auth headers
# retry once to reset connection with Keycloak after tomcat's ConnectionTimeout # retry once to reset connection with Keycloak after tomcat's ConnectionTimeout
# see https://github.com/marcospereirampj/python-keycloak/issues/36 # see https://github.com/marcospereirampj/python-keycloak/issues/36
for protocol in ("https://", "http://"): for protocol in ("https://", "http://"):
adapter = HTTPAdapter(max_retries=max_retries)
adapter_kwargs = {"max_retries": max_retries}
if pool_maxsize is not None:
adapter_kwargs["pool_maxsize"] = pool_maxsize
adapter = HTTPAdapter(**adapter_kwargs)
# adds POST to retry whitelist # adds POST to retry whitelist
allowed_methods = set(adapter.max_retries.allowed_methods) allowed_methods = set(adapter.max_retries.allowed_methods)
allowed_methods.add("POST") allowed_methods.add("POST")
@ -114,7 +123,15 @@ class ConnectionManager:
if proxies: if proxies:
self._s.proxies.update(proxies) self._s.proxies.update(proxies)
self.async_s = httpx.AsyncClient(verify=verify, mounts=proxies, cert=cert)
self.async_s = httpx.AsyncClient(
verify=verify,
mounts=proxies,
cert=cert,
limits=httpx.Limits(
max_connections=100 if pool_maxsize is None else pool_maxsize,
max_keepalive_connections=20,
),
)
self.async_s.auth = None # don't let requests add auth headers self.async_s.auth = None # don't let requests add auth headers
self.async_s.transport = httpx.AsyncHTTPTransport(retries=1) self.async_s.transport = httpx.AsyncHTTPTransport(retries=1)
@ -184,6 +201,20 @@ class ConnectionManager:
def cert(self, value: str | tuple) -> None: def cert(self, value: str | tuple) -> None:
self._cert = value self._cert = value
@property
def pool_maxsize(self) -> int | None:
"""
Return the maximum number of connections to save in the pool.
:returns: Pool maxsize
:rtype: int or None
"""
return self._pool_maxsize
@pool_maxsize.setter
def pool_maxsize(self, value: int | None) -> None:
self._pool_maxsize = value
@property @property
def headers(self) -> dict: def headers(self) -> dict:
""" """

10
src/keycloak/keycloak_admin.py

@ -87,6 +87,8 @@ class KeycloakAdmin:
:type max_retries: int :type max_retries: int
:param connection: A KeycloakOpenIDConnection as an alternative to individual params. :param connection: A KeycloakOpenIDConnection as an alternative to individual params.
:type connection: KeycloakOpenIDConnection :type connection: KeycloakOpenIDConnection
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
PAGE_SIZE = 100 PAGE_SIZE = 100
@ -109,6 +111,7 @@ class KeycloakAdmin:
cert: str | tuple | None = None, cert: str | tuple | None = None,
max_retries: int = 1, max_retries: int = 1,
connection: KeycloakOpenIDConnection | None = None, connection: KeycloakOpenIDConnection | None = None,
pool_maxsize: int | None = None,
) -> None: ) -> None:
""" """
Init method. Init method.
@ -148,6 +151,8 @@ class KeycloakAdmin:
:type max_retries: int :type max_retries: int
:param connection: An OpenID Connection as an alternative to individual params. :param connection: An OpenID Connection as an alternative to individual params.
:type connection: KeycloakOpenIDConnection :type connection: KeycloakOpenIDConnection
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
self.connection = connection or KeycloakOpenIDConnection( self.connection = connection or KeycloakOpenIDConnection(
server_url=server_url, server_url=server_url,
@ -165,6 +170,7 @@ class KeycloakAdmin:
timeout=timeout, timeout=timeout,
cert=cert, cert=cert,
max_retries=max_retries, max_retries=max_retries,
pool_maxsize=pool_maxsize,
) )
@property @property
@ -1670,7 +1676,7 @@ class KeycloakAdmin:
def send_update_account( def send_update_account(
self, self,
user_id: str, user_id: str,
payload: dict,
payload: list,
client_id: str | None = None, client_id: str | None = None,
lifespan: int | None = None, lifespan: int | None = None,
redirect_uri: str | None = None, redirect_uri: str | None = None,
@ -6960,7 +6966,7 @@ class KeycloakAdmin:
async def a_send_update_account( async def a_send_update_account(
self, self,
user_id: str, user_id: str,
payload: dict,
payload: list,
client_id: str | None = None, client_id: str | None = None,
lifespan: int | None = None, lifespan: int | None = None,
redirect_uri: str | None = None, redirect_uri: str | None = None,

7
src/keycloak/keycloak_openid.py

@ -87,7 +87,8 @@ class KeycloakOpenID:
Either a path to an SSL certificate file, or two-tuple of Either a path to an SSL certificate file, or two-tuple of
(certificate file, key file). (certificate file, key file).
:param max_retries: The total number of times to retry HTTP requests. :param max_retries: The total number of times to retry HTTP requests.
:type max_retries: int
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
def __init__( def __init__(
@ -102,6 +103,7 @@ class KeycloakOpenID:
timeout: int = 60, timeout: int = 60,
cert: str | tuple | None = None, cert: str | tuple | None = None,
max_retries: int = 1, max_retries: int = 1,
pool_maxsize: int | None = None,
) -> None: ) -> None:
""" """
Init method. Init method.
@ -129,6 +131,8 @@ class KeycloakOpenID:
:type cert: Union[str,Tuple[str,str]] :type cert: Union[str,Tuple[str,str]]
:param max_retries: The total number of times to retry HTTP requests. :param max_retries: The total number of times to retry HTTP requests.
:type max_retries: int :type max_retries: int
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
self.client_id = client_id self.client_id = client_id
self.client_secret_key = client_secret_key self.client_secret_key = client_secret_key
@ -142,6 +146,7 @@ class KeycloakOpenID:
proxies=proxies, proxies=proxies,
cert=cert, cert=cert,
max_retries=max_retries, max_retries=max_retries,
pool_maxsize=pool_maxsize,
) )
self.authorization = Authorization() self.authorization = Authorization()

4
src/keycloak/openid_connection.py

@ -82,6 +82,7 @@ class KeycloakOpenIDConnection(ConnectionManager):
timeout: int | None = 60, timeout: int | None = 60,
cert: str | tuple | None = None, cert: str | tuple | None = None,
max_retries: int = 1, max_retries: int = 1,
pool_maxsize: int | None = None,
) -> None: ) -> None:
""" """
Init method. Init method.
@ -120,6 +121,8 @@ class KeycloakOpenIDConnection(ConnectionManager):
:type cert: Union[str,Tuple[str,str]] :type cert: Union[str,Tuple[str,str]]
:param max_retries: The total number of times to retry HTTP requests. :param max_retries: The total number of times to retry HTTP requests.
:type max_retries: int :type max_retries: int
:param pool_maxsize: The maximum number of connections to save in the pool.
:type pool_maxsize: int
""" """
# token is renewed when it hits 90% of its lifetime. This is to account for any possible # token is renewed when it hits 90% of its lifetime. This is to account for any possible
# clock skew. # clock skew.
@ -154,6 +157,7 @@ class KeycloakOpenIDConnection(ConnectionManager):
verify=self.verify, verify=self.verify,
cert=cert, cert=cert,
max_retries=max_retries, max_retries=max_retries,
pool_maxsize=pool_maxsize,
) )
@property @property

26
tests/test_keycloak_admin.py

@ -57,6 +57,7 @@ def test_keycloak_admin_init(env: KeycloakTestEnv) -> None:
server_url=f"http://{env.keycloak_host}:{env.keycloak_port}", server_url=f"http://{env.keycloak_host}:{env.keycloak_port}",
username=env.keycloak_admin, username=env.keycloak_admin,
password=env.keycloak_admin_password, password=env.keycloak_admin_password,
pool_maxsize=5,
) )
assert admin.connection.server_url == f"http://{env.keycloak_host}:{env.keycloak_port}", ( assert admin.connection.server_url == f"http://{env.keycloak_host}:{env.keycloak_port}", (
admin.connection.server_url admin.connection.server_url
@ -72,6 +73,7 @@ def test_keycloak_admin_init(env: KeycloakTestEnv) -> None:
assert admin.connection.token is None, admin.connection.token assert admin.connection.token is None, admin.connection.token
assert admin.connection.user_realm_name is None, admin.connection.user_realm_name assert admin.connection.user_realm_name is None, admin.connection.user_realm_name
assert admin.connection.custom_headers is None, admin.connection.custom_headers assert admin.connection.custom_headers is None, admin.connection.custom_headers
assert admin.connection.pool_maxsize == 5, admin.connection.pool_maxsize
admin = KeycloakAdmin( admin = KeycloakAdmin(
server_url=f"http://{env.keycloak_host}:{env.keycloak_port}", server_url=f"http://{env.keycloak_host}:{env.keycloak_port}",
@ -2622,7 +2624,7 @@ def test_auth_flows(admin: KeycloakAdmin, realm: str) -> None:
# Test flow executions # Test flow executions
res = admin.get_authentication_flow_executions(flow_alias="browser") res = admin.get_authentication_flow_executions(flow_alias="browser")
assert len(res) in [8, 12, 14], res
assert len(res) in [8, 12, 14, 15], res
with pytest.raises(KeycloakGetError) as err: with pytest.raises(KeycloakGetError) as err:
admin.get_authentication_flow_executions(flow_alias="bad") admin.get_authentication_flow_executions(flow_alias="bad")
@ -2765,7 +2767,7 @@ def test_authentication_configs(admin: KeycloakAdmin, realm: str) -> None:
# Test list of auth providers # Test list of auth providers
res = admin.get_authenticator_providers() res = admin.get_authenticator_providers()
assert len(res) <= 41
assert len(res) <= 42
res = admin.get_authenticator_provider_config_description(provider_id="auth-cookie") res = admin.get_authenticator_provider_config_description(provider_id="auth-cookie")
assert res == { assert res == {
@ -3328,7 +3330,7 @@ def test_get_bruteforce_status_for_user(
:param realm: Keycloak realm :param realm: Keycloak realm
:type realm: str :type realm: str
""" """
oid, username, password = oid_with_credentials
oid, username, _ = oid_with_credentials
admin.change_current_realm(realm) admin.change_current_realm(realm)
# Turn on bruteforce protection # Turn on bruteforce protection
@ -3366,7 +3368,7 @@ def test_clear_bruteforce_attempts_for_user(
:param realm: Keycloak realm :param realm: Keycloak realm
:type realm: str :type realm: str
""" """
oid, username, password = oid_with_credentials
oid, username, _ = oid_with_credentials
admin.change_current_realm(realm) admin.change_current_realm(realm)
# Turn on bruteforce protection # Turn on bruteforce protection
@ -3407,7 +3409,7 @@ def test_clear_bruteforce_attempts_for_all_users(
:param realm: Keycloak realm :param realm: Keycloak realm
:type realm: str :type realm: str
""" """
oid, username, password = oid_with_credentials
oid, username, _ = oid_with_credentials
admin.change_current_realm(realm) admin.change_current_realm(realm)
# Turn on bruteforce protection # Turn on bruteforce protection
@ -3568,7 +3570,7 @@ def test_initial_access_token(
assert res["count"] == 2 assert res["count"] == 2
assert res["expiration"] == 3 assert res["expiration"] == 3
oid, username, password = oid_with_credentials
oid, _, _ = oid_with_credentials
client = str(uuid.uuid4()) client = str(uuid.uuid4())
secret = str(uuid.uuid4()) secret = str(uuid.uuid4())
@ -6328,7 +6330,7 @@ async def test_a_auth_flows(admin: KeycloakAdmin, realm: str) -> None:
# Test flow executions # Test flow executions
res = await admin.a_get_authentication_flow_executions(flow_alias="browser") res = await admin.a_get_authentication_flow_executions(flow_alias="browser")
assert len(res) in [8, 12, 14], res
assert len(res) in [8, 12, 14, 15], res
with pytest.raises(KeycloakGetError) as err: with pytest.raises(KeycloakGetError) as err:
await admin.a_get_authentication_flow_executions(flow_alias="bad") await admin.a_get_authentication_flow_executions(flow_alias="bad")
@ -6476,7 +6478,7 @@ async def test_a_authentication_configs(admin: KeycloakAdmin, realm: str) -> Non
# Test list of auth providers # Test list of auth providers
res = await admin.a_get_authenticator_providers() res = await admin.a_get_authenticator_providers()
assert len(res) <= 41
assert len(res) <= 42
res = await admin.a_get_authenticator_provider_config_description(provider_id="auth-cookie") res = await admin.a_get_authenticator_provider_config_description(provider_id="auth-cookie")
assert res == { assert res == {
@ -7062,7 +7064,7 @@ async def test_a_get_bruteforce_status_for_user(
:param realm: Keycloak realm :param realm: Keycloak realm
:type realm: str :type realm: str
""" """
oid, username, password = oid_with_credentials
oid, username, _ = oid_with_credentials
await admin.a_change_current_realm(realm) await admin.a_change_current_realm(realm)
# Turn on bruteforce protection # Turn on bruteforce protection
@ -7101,7 +7103,7 @@ async def test_a_clear_bruteforce_attempts_for_user(
:param realm: Keycloak realm :param realm: Keycloak realm
:type realm: str :type realm: str
""" """
oid, username, password = oid_with_credentials
oid, username, _ = oid_with_credentials
await admin.a_change_current_realm(realm) await admin.a_change_current_realm(realm)
# Turn on bruteforce protection # Turn on bruteforce protection
@ -7143,7 +7145,7 @@ async def test_a_clear_bruteforce_attempts_for_all_users(
:param realm: Keycloak realm :param realm: Keycloak realm
:type realm: str :type realm: str
""" """
oid, username, password = oid_with_credentials
oid, username, _ = oid_with_credentials
await admin.a_change_current_realm(realm) await admin.a_change_current_realm(realm)
# Turn on bruteforce protection # Turn on bruteforce protection
@ -7317,7 +7319,7 @@ async def test_a_initial_access_token(
assert res["count"] == 2 assert res["count"] == 2
assert res["expiration"] == 3 assert res["expiration"] == 3
oid, username, password = oid_with_credentials
oid, _, _ = oid_with_credentials
client = str(uuid.uuid4()) client = str(uuid.uuid4())
secret = str(uuid.uuid4()) secret = str(uuid.uuid4())

13
tests/test_keycloak_openid.py

@ -35,6 +35,7 @@ def test_keycloak_openid_init(env: KeycloakTestEnv) -> None:
server_url=f"http://{env.keycloak_host}:{env.keycloak_port}", server_url=f"http://{env.keycloak_host}:{env.keycloak_port}",
realm_name="master", realm_name="master",
client_id="admin-cli", client_id="admin-cli",
pool_maxsize=5,
) )
assert oid.client_id == "admin-cli" assert oid.client_id == "admin-cli"
@ -42,6 +43,14 @@ def test_keycloak_openid_init(env: KeycloakTestEnv) -> None:
assert oid.realm_name == "master" assert oid.realm_name == "master"
assert isinstance(oid.connection, ConnectionManager) assert isinstance(oid.connection, ConnectionManager)
assert isinstance(oid.authorization, Authorization) assert isinstance(oid.authorization, Authorization)
assert oid.connection.pool_maxsize == 5
oid_default = KeycloakOpenID(
server_url=f"http://{env.keycloak_host}:{env.keycloak_port}",
realm_name="master",
client_id="admin-cli",
)
assert oid_default.connection.pool_maxsize is None
def test_well_known(oid: KeycloakOpenID) -> None: def test_well_known(oid: KeycloakOpenID) -> None:
@ -383,7 +392,7 @@ def test_load_authorization_config(
server with client credentials server with client credentials
:type oid_with_credentials_authz: Tuple[KeycloakOpenID, str, str] :type oid_with_credentials_authz: Tuple[KeycloakOpenID, str, str]
""" """
oid, username, password = oid_with_credentials_authz
oid, _, _ = oid_with_credentials_authz
oid.load_authorization_config(path="tests/data/authz_settings.json") oid.load_authorization_config(path="tests/data/authz_settings.json")
assert "test-authz-rb-policy" in oid.authorization.policies assert "test-authz-rb-policy" in oid.authorization.policies
@ -927,7 +936,7 @@ async def test_a_load_authorization_config(
server with client credentials server with client credentials
:type oid_with_credentials_authz: Tuple[KeycloakOpenID, str, str] :type oid_with_credentials_authz: Tuple[KeycloakOpenID, str, str]
""" """
oid, username, password = oid_with_credentials_authz
oid, _, _ = oid_with_credentials_authz
await oid.a_load_authorization_config(path="tests/data/authz_settings.json") await oid.a_load_authorization_config(path="tests/data/authz_settings.json")
assert "test-authz-rb-policy" in oid.authorization.policies assert "test-authz-rb-policy" in oid.authorization.policies

Loading…
Cancel
Save