diff --git a/server/vbv_lernwelt/core/managers.py b/server/vbv_lernwelt/core/managers.py index e2b4aeb2..12389f45 100644 --- a/server/vbv_lernwelt/core/managers.py +++ b/server/vbv_lernwelt/core/managers.py @@ -3,17 +3,20 @@ from django.contrib.auth.models import AbstractUser class UserManager(BaseUserManager): - def create_or_update_by_email( - self, email: str, first_name: str, last_name: str, username: str - ) -> tuple[AbstractUser, bool]: + def create_or_update_by_email(self, user_dict: dict) -> tuple[AbstractUser, bool]: # create or sync user with OpenID Data - user, created = self.model.objects.get_or_create( - email=email, - defaults={ - "first_name": first_name, - "last_name": last_name, - "username": username, - }, - ) + user, created = self.model.objects.get_or_create(sso_id=user_dict['oid'], defaults={ + "email": user_dict["email"], + "username": user_dict["email"], + "first_name": user_dict['first_name'], + "last_name": user_dict['last_name'], + }) + + if not created: + user.email = user_dict["email"] + user.username = user_dict["email"] + user.first_name = user_dict['first_name'] + user.last_name = user_dict['last_name'] + user.save() return user, created diff --git a/server/vbv_lernwelt/core/migrations/0004_alter_user_managers.py b/server/vbv_lernwelt/core/migrations/0003_alter_user_managers.py similarity index 87% rename from server/vbv_lernwelt/core/migrations/0004_alter_user_managers.py rename to server/vbv_lernwelt/core/migrations/0003_alter_user_managers.py index ea675910..ed53b3ab 100644 --- a/server/vbv_lernwelt/core/migrations/0004_alter_user_managers.py +++ b/server/vbv_lernwelt/core/migrations/0003_alter_user_managers.py @@ -4,9 +4,8 @@ from django.db import migrations class Migration(migrations.Migration): - dependencies = [ - ("core", "0003_create_users"), + ("core", "0002_user_model"), ] operations = [ diff --git a/server/vbv_lernwelt/core/migrations/0003_create_users.py b/server/vbv_lernwelt/core/migrations/0005_create_users.py similarity index 94% rename from server/vbv_lernwelt/core/migrations/0003_create_users.py rename to server/vbv_lernwelt/core/migrations/0005_create_users.py index 043919a3..b843aad0 100644 --- a/server/vbv_lernwelt/core/migrations/0003_create_users.py +++ b/server/vbv_lernwelt/core/migrations/0005_create_users.py @@ -17,7 +17,7 @@ def create_users(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ("core", "0002_user_model"), + ("core", "0004_user_sso_id"), ] operations = [ diff --git a/server/vbv_lernwelt/core/models.py b/server/vbv_lernwelt/core/models.py index 36a21ee3..feb0b69b 100644 --- a/server/vbv_lernwelt/core/models.py +++ b/server/vbv_lernwelt/core/models.py @@ -15,6 +15,7 @@ class User(AbstractUser): # objects = UserManager() avatar_url = models.CharField(max_length=254, blank=True, default="") email = models.EmailField("email address", unique=True) + sso_id = models.UUIDField('SSO subscriber ID', unique=True, null=True, blank=True, default=None) objects = UserManager() diff --git a/server/vbv_lernwelt/sso/views.py b/server/vbv_lernwelt/sso/views.py index 04c27ed3..e068f7a7 100644 --- a/server/vbv_lernwelt/sso/views.py +++ b/server/vbv_lernwelt/sso/views.py @@ -1,3 +1,5 @@ +import json + import structlog as structlog from authlib.integrations.base_client import OAuthError from django.conf import settings @@ -28,6 +30,7 @@ def authorize(request): request ) deocded_token = decode_jwt(token["id_token"]) + return HttpResponse(json.dumps(deocded_token)) except OAuthError as e: logger.error(f"OAuth error: {e}") if not settings.DEBUG: @@ -54,4 +57,5 @@ def _user_data_from_token_data(token: dict) -> dict: "last_name": token.get("family_name", ""), "username": token.get("preferred_username", first_email), "email": first_email, + "sub": token.get("sub") }