From 70d7713ba8bd61a0fa711f062b73da707efb8ef0 Mon Sep 17 00:00:00 2001 From: Lucy Linder Date: Thu, 20 Jul 2023 16:54:22 +0200 Subject: [PATCH] Make Keycloak's ID_KEY configurable --- CHANGELOG.md | 1 + social_core/backends/keycloak.py | 14 +++++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a7ffbd10..2b8cc954 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ### Changed - Fixed Azure AD Tenant authentication with custom signing keys - Added CAS OIDC backend +- Made Keycloak `ID_KEY` configurable ## [4.4.1](https://github.com/python-social-auth/social-core/releases/tag/4.4.1) - 2023-03-30 diff --git a/social_core/backends/keycloak.py b/social_core/backends/keycloak.py index 494ddabd..d5d2751f 100644 --- a/social_core/backends/keycloak.py +++ b/social_core/backends/keycloak.py @@ -96,7 +96,6 @@ class KeycloakOAuth2(BaseOAuth2): # pylint: disable=abstract-method """ name = "keycloak" - ID_KEY = "username" ACCESS_TOKEN_METHOD = "POST" REDIRECT_STATE = False @@ -121,6 +120,9 @@ def public_key(self): ] ) + def id_key(self): + return self.setting("ID_KEY", default="username") + def user_data( self, access_token, *args, **kwargs ): # pylint: disable=unused-argument @@ -149,5 +151,11 @@ def get_user_details(self, response): } def get_user_id(self, details, response): - """Get and associate Django User by the field indicated by ID_KEY""" - return details.get(self.ID_KEY) + """Get and associate Django User by the field indicated by ID_KEY + + The ID_KEY can be any field in the user details or the access token. + """ + id_key = self.id_key() + if id_key in details: + return details[id_key] + return response.get(id_key)