diff --git a/.gitignore b/.gitignore index 7f70171..8b31e0e 100644 --- a/.gitignore +++ b/.gitignore @@ -104,3 +104,4 @@ ENV/ docs/_build .pytest_cache +.vscode diff --git a/README.rst b/README.rst index 1ed0723..3306a33 100644 --- a/README.rst +++ b/README.rst @@ -87,6 +87,12 @@ Release Notes **unreleased** +**v0.3.0** + +* Added support for Keycloak v17.0 and newer (tested till Keycloak v19.0), by removing `auth` from the APIs URIs as it no longer exists in Keycloak APIs +You still can use this version with old Keycloak versions if you add `/auth` at the end of the baseUri. +E.g: 'baseUri' => 'http://keycloak-domain.com/auth', + **v0.2.3** diff --git a/docs/conf.py b/docs/conf.py index 0cc0849..a601dbe 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -55,9 +55,9 @@ # built documents. # # The short X.Y version. -version = '0.2.4-dev' +version = '0.3.0' # The full version, including alpha/beta/rc tags. -release = '0.2.4-dev' +release = '0.3.0' # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. diff --git a/setup.cfg b/setup.cfg index d68f472..ea61317 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,5 +1,5 @@ [bumpversion] -current_version = 0.2.4-dev +current_version = 0.3.0 commit = True tag = True parse = (?P\d+)\.(?P\d+)\.(?P\d+)(\-(?P[a-z]+))? diff --git a/setup.py b/setup.py index b81cd0b..f0c89c7 100644 --- a/setup.py +++ b/setup.py @@ -3,7 +3,7 @@ from setuptools import find_packages, setup -VERSION = '0.2.4-dev' +VERSION = '0.3.0' AIO_COMPATIBLE = sys.version_info >= (3, 5, 3) with open(os.path.join(os.path.dirname(__file__), 'README.rst')) as readme: diff --git a/src/keycloak/admin/clientroles.py b/src/keycloak/admin/clientroles.py index 384201f..2440c70 100644 --- a/src/keycloak/admin/clientroles.py +++ b/src/keycloak/admin/clientroles.py @@ -27,7 +27,7 @@ class ClientRoles(KeycloakAdminBase): _client_id = None _realm_name = None _paths = { - 'collection': '/auth/admin/realms/{realm}/clients/{id}/roles' + 'collection': '/admin/realms/{realm}/clients/{id}/roles' } def __init__(self, realm_name, client_id, *args, **kwargs): @@ -74,7 +74,7 @@ def create(self, name, **kwargs): class ClientRole(KeycloakAdminBase): _paths = { - 'single': '/auth/admin/realms/{realm}/clients/{id}/roles/{role_name}' + 'single': '/admin/realms/{realm}/clients/{id}/roles/{role_name}' } def __init__(self, realm_name, client_id, role_name, *args, **kwargs): diff --git a/src/keycloak/admin/clients.py b/src/keycloak/admin/clients.py index 38e8414..ad9304b 100644 --- a/src/keycloak/admin/clients.py +++ b/src/keycloak/admin/clients.py @@ -6,7 +6,7 @@ class Clients(KeycloakAdminBase): _realm_name = None _paths = { - 'collection': '/auth/admin/realms/{realm}/clients' + 'collection': '/admin/realms/{realm}/clients' } def __init__(self, realm_name, *args, **kwargs): diff --git a/src/keycloak/admin/groups.py b/src/keycloak/admin/groups.py index 80cd32f..e6388ea 100644 --- a/src/keycloak/admin/groups.py +++ b/src/keycloak/admin/groups.py @@ -7,7 +7,7 @@ class Groups(KeycloakAdminBase): _paths = { - 'collection': '/auth/admin/realms/{realm}/groups', + 'collection': '/admin/realms/{realm}/groups', } def __init__(self, realm_name, *args, **kwargs): diff --git a/src/keycloak/admin/user/usergroup.py b/src/keycloak/admin/user/usergroup.py index 18caa95..5ffde0f 100644 --- a/src/keycloak/admin/user/usergroup.py +++ b/src/keycloak/admin/user/usergroup.py @@ -4,7 +4,7 @@ class UserGroups(KeycloakAdminBase): - _BASE = "/auth/admin/realms/{realm}/users/{user_id}" + _BASE = "/admin/realms/{realm}/users/{user_id}" _paths = { 'collection': _BASE + '/groups', 'single': _BASE + '/groups/{group_id}' diff --git a/src/keycloak/admin/user/userroles.py b/src/keycloak/admin/user/userroles.py index e41cc30..3b3b92f 100644 --- a/src/keycloak/admin/user/userroles.py +++ b/src/keycloak/admin/user/userroles.py @@ -23,9 +23,9 @@ def realm(self): class UserRoleMappingsRealm(KeycloakAdminBase): _paths = { - 'available': '/auth/admin/realms/{realm}/users/{id}' + + 'available': '/admin/realms/{realm}/users/{id}' + '/role-mappings/realm/available', - 'single': '/auth/admin/realms/{realm}/users/{id}' + + 'single': '/admin/realms/{realm}/users/{id}' + '/role-mappings/realm' } diff --git a/src/keycloak/admin/users.py b/src/keycloak/admin/users.py index cc8b5a6..7cf8f75 100644 --- a/src/keycloak/admin/users.py +++ b/src/keycloak/admin/users.py @@ -21,7 +21,7 @@ class Users(KeycloakAdminBase): _paths = { - 'collection': '/auth/admin/realms/{realm}/users' + 'collection': '/admin/realms/{realm}/users' } _realm_name = None @@ -75,7 +75,7 @@ def by_id(self, user_id): class User(KeycloakAdminBase): - _BASE = "/auth/admin/realms/{realm}/users/{user_id}" + _BASE = "/admin/realms/{realm}/users/{user_id}" _paths = { 'single': _BASE, 'reset_password': _BASE + "/reset-password", diff --git a/src/keycloak/authz.py b/src/keycloak/authz.py index cb2c8a9..d64819f 100644 --- a/src/keycloak/authz.py +++ b/src/keycloak/authz.py @@ -10,9 +10,9 @@ from keycloak.mixins import WellKnownMixin from keycloak.exceptions import KeycloakClientError -PATH_ENTITLEMENT = "auth/realms/{}/authz/entitlement/{}" +PATH_ENTITLEMENT = "realms/{}/authz/entitlement/{}" -PATH_WELL_KNOWN = "auth/realms/{}/.well-known/uma2-configuration" +PATH_WELL_KNOWN = "realms/{}/.well-known/uma2-configuration" class KeycloakAuthz(WellKnownMixin, object): diff --git a/src/keycloak/openid_connect.py b/src/keycloak/openid_connect.py index 420fa3d..15db8a3 100644 --- a/src/keycloak/openid_connect.py +++ b/src/keycloak/openid_connect.py @@ -7,7 +7,7 @@ from jose import jwt -PATH_WELL_KNOWN = "auth/realms/{}/.well-known/openid-configuration" +PATH_WELL_KNOWN = "realms/{}/.well-known/openid-configuration" class KeycloakOpenidConnect(WellKnownMixin): diff --git a/src/keycloak/uma.py b/src/keycloak/uma.py index 46da7e4..f5c0ea8 100644 --- a/src/keycloak/uma.py +++ b/src/keycloak/uma.py @@ -7,7 +7,7 @@ from keycloak.mixins import WellKnownMixin -PATH_WELL_KNOWN = "auth/realms/{}/.well-known/uma2-configuration" +PATH_WELL_KNOWN = "realms/{}/.well-known/uma2-configuration" class KeycloakUMA(WellKnownMixin, object): diff --git a/src/keycloak/uma1.py b/src/keycloak/uma1.py index 56920e5..83b68d9 100644 --- a/src/keycloak/uma1.py +++ b/src/keycloak/uma1.py @@ -7,7 +7,7 @@ from keycloak.mixins import WellKnownMixin -PATH_WELL_KNOWN = "auth/realms/{}/.well-known/uma-configuration" +PATH_WELL_KNOWN = "realms/{}/.well-known/uma-configuration" class KeycloakUMA1(WellKnownMixin, object): diff --git a/tests/keycloak/admin/test_client_roles.py b/tests/keycloak/admin/test_client_roles.py index 338cd30..c507c64 100644 --- a/tests/keycloak/admin/test_client_roles.py +++ b/tests/keycloak/admin/test_client_roles.py @@ -26,7 +26,7 @@ def test_create(self): scope_param_required=True ) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/clients/#123/roles' + '/admin/realms/realm-name/clients/#123/roles' ) self.realm.client.post.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -59,7 +59,7 @@ def test_update(self): scope_param_required=True ) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/clients/#123/roles/role-name' + '/admin/realms/realm-name/clients/#123/roles/role-name' ) self.realm.client.put.assert_called_once_with( url=self.realm.client.get_full_url.return_value, diff --git a/tests/keycloak/admin/test_groups.py b/tests/keycloak/admin/test_groups.py index 1e9076a..d2590fc 100644 --- a/tests/keycloak/admin/test_groups.py +++ b/tests/keycloak/admin/test_groups.py @@ -16,7 +16,7 @@ def setUp(self): def test_create(self): self.admin.realms.by_name('realm-name').groups.create("group-name") self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/groups' + '/admin/realms/realm-name/groups' ) self.realm.client.post.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -30,7 +30,7 @@ def test_create(self): def test_get_all(self): self.admin.realms.by_name('realm-name').groups.all() self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/groups' + '/admin/realms/realm-name/groups' ) self.realm.client.get.assert_called_once_with( url=self.realm.client.get_full_url.return_value, diff --git a/tests/keycloak/admin/test_user_roles.py b/tests/keycloak/admin/test_user_roles.py index bcccc6a..1139725 100644 --- a/tests/keycloak/admin/test_user_roles.py +++ b/tests/keycloak/admin/test_user_roles.py @@ -27,7 +27,7 @@ def test_add_role(self): self.admin.realms.by_name('realm-name').users.by_id( 'user-id').role_mappings.realm.add(role_representations) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users/user-id' + + '/admin/realms/realm-name/users/user-id' + '/role-mappings/realm' ) self.realm.client.post.assert_called_once_with( @@ -52,7 +52,7 @@ def test_get_available_realm_role(self): self.admin.realms.by_name('realm-name').users.by_id( 'user-id').role_mappings.realm.available() self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users/user-id' + + '/admin/realms/realm-name/users/user-id' + '/role-mappings/realm/available' ) self.realm.client.get.assert_called_once_with( @@ -67,7 +67,7 @@ def test_get_realm_role(self): self.admin.realms.by_name('realm-name').users.by_id( 'user-id').role_mappings.realm.get() self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users/user-id' + + '/admin/realms/realm-name/users/user-id' + '/role-mappings/realm' ) self.realm.client.get.assert_called_once_with( @@ -92,7 +92,7 @@ def test_delete_role(self): self.admin.realms.by_name('realm-name').users.by_id( 'user-id').role_mappings.realm.delete(role_representations) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users/user-id' + + '/admin/realms/realm-name/users/user-id' + '/role-mappings/realm' ) self.realm.client.delete.assert_called_once_with( diff --git a/tests/keycloak/admin/test_users.py b/tests/keycloak/admin/test_users.py index 2839063..b2734b7 100644 --- a/tests/keycloak/admin/test_users.py +++ b/tests/keycloak/admin/test_users.py @@ -23,7 +23,7 @@ def test_create(self): enabled=True ) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users' + '/admin/realms/realm-name/users' ) self.realm.client.post.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -48,7 +48,7 @@ def test_create(self): def test_get_collection(self): self.admin.realms.by_name('realm-name').users.all() self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users' + '/admin/realms/realm-name/users' ) self.realm.client.get.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -61,7 +61,7 @@ def test_get_collection(self): def test_get_single(self): self.admin.realms.by_name('realm-name').users.by_id('an-id').get() self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users/an-id' + '/admin/realms/realm-name/users/an-id' ) self.realm.client.get.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -74,7 +74,7 @@ def test_get_single(self): def test_get_single_user(self): self.admin.realms.by_name('realm-name').users.by_id('an-id').user self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users/an-id' + '/admin/realms/realm-name/users/an-id' ) self.realm.client.get.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -95,7 +95,7 @@ def test_update(self): enabled=True ) self.realm.client.get_full_url.assert_called_with( - '/auth/admin/realms/realm-name/users/user-id' + '/admin/realms/realm-name/users/user-id' ) self.realm.client.put.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -122,7 +122,7 @@ def test_delete(self): user = self.admin.realms.by_name('realm-name').users.by_id("user-id") user.delete() self.realm.client.get_full_url.assert_called_with( - '/auth/admin/realms/realm-name/users/user-id' + '/admin/realms/realm-name/users/user-id' ) self.realm.client.delete.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -137,7 +137,7 @@ def test_delete_group(self): user = self.admin.realms.by_name('realm-name').users.by_id("user-id") user.groups.delete('group-id') self.realm.client.get_full_url.assert_called_with( - '/auth/admin/realms/realm-name/users/user-id/groups/group-id' + '/admin/realms/realm-name/users/user-id/groups/group-id' ) self.realm.client.delete.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -152,7 +152,7 @@ def test_reset_password(self): user = self.admin.realms.by_name('realm-name').users.by_id("user-id") user.reset_password("password", True) self.realm.client.get_full_url.assert_called_with( - '/auth/admin/realms/realm-name/users/user-id/reset-password' + '/admin/realms/realm-name/users/user-id/reset-password' ) self.realm.client.put.assert_called_once_with( url=self.realm.client.get_full_url.return_value, @@ -170,7 +170,7 @@ def test_logout_user(self): user = self.admin.realms.by_name('realm-name').users.by_id("user-id") user.logout() self.realm.client.get_full_url.assert_called_with( - '/auth/admin/realms/realm-name/users/user-id/logout' + '/admin/realms/realm-name/users/user-id/logout' ) self.realm.client.post.assert_called_once_with( url=self.realm.client.get_full_url.return_value, diff --git a/tests/keycloak/aio/admin/test_roles.py b/tests/keycloak/aio/admin/test_roles.py index fd2fea7..7fa0278 100644 --- a/tests/keycloak/aio/admin/test_roles.py +++ b/tests/keycloak/aio/admin/test_roles.py @@ -43,7 +43,7 @@ async def test_create(self): ) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/clients/#123/roles' + '/admin/realms/realm-name/clients/#123/roles' ) self.realm.client.post.assert_awaited_once_with( url=self.realm.client.get_full_url.return_value, @@ -77,7 +77,7 @@ async def test_update(self): scope_param_required=True ) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/clients/#123/roles/role-name' + '/admin/realms/realm-name/clients/#123/roles/role-name' ) self.realm.client.put.assert_awaited_once_with( url=self.realm.client.get_full_url.return_value, diff --git a/tests/keycloak/aio/admin/test_users.py b/tests/keycloak/aio/admin/test_users.py index d3c2e66..c2dca9a 100644 --- a/tests/keycloak/aio/admin/test_users.py +++ b/tests/keycloak/aio/admin/test_users.py @@ -33,7 +33,7 @@ async def test_create(self): enabled=True ) self.realm.client.get_full_url.assert_called_once_with( - '/auth/admin/realms/realm-name/users' + '/admin/realms/realm-name/users' ) self.realm.client.post.assert_awaited_once_with( url=self.realm.client.get_full_url.return_value, diff --git a/tests/keycloak/aio/test_authz.py b/tests/keycloak/aio/test_authz.py index 2138dbf..cefc1c4 100644 --- a/tests/keycloak/aio/test_authz.py +++ b/tests/keycloak/aio/test_authz.py @@ -32,7 +32,7 @@ async def test_entitlement(self): result = await self.authz.entitlement(token='some-token') self.realm.client.get_full_url.assert_any_call( - 'auth/realms/realm-name/authz/entitlement/client-id' + 'realms/realm-name/authz/entitlement/client-id' ) self.realm.client.get.assert_any_await( self.realm.client.get_full_url.return_value, diff --git a/tests/keycloak/test_authz.py b/tests/keycloak/test_authz.py index d341427..736df2f 100644 --- a/tests/keycloak/test_authz.py +++ b/tests/keycloak/test_authz.py @@ -19,7 +19,7 @@ def test_entitlement(self): result = self.authz.entitlement(token='some-token') self.realm.client.get_full_url.assert_called_once_with( - 'auth/realms/realm-name/authz/entitlement/client-id' + 'realms/realm-name/authz/entitlement/client-id' ) self.realm.client.get.assert_called_once_with( self.realm.client.get_full_url.return_value,