Add sso_id field

This commit is contained in:
Christian Cueni 2023-01-09 16:02:19 +01:00
parent b87881136c
commit e2ce704a40
5 changed files with 21 additions and 14 deletions

View File

@ -3,17 +3,20 @@ from django.contrib.auth.models import AbstractUser
class UserManager(BaseUserManager): class UserManager(BaseUserManager):
def create_or_update_by_email( def create_or_update_by_email(self, user_dict: dict) -> tuple[AbstractUser, bool]:
self, email: str, first_name: str, last_name: str, username: str
) -> tuple[AbstractUser, bool]:
# create or sync user with OpenID Data # create or sync user with OpenID Data
user, created = self.model.objects.get_or_create( user, created = self.model.objects.get_or_create(sso_id=user_dict['oid'], defaults={
email=email, "email": user_dict["email"],
defaults={ "username": user_dict["email"],
"first_name": first_name, "first_name": user_dict['first_name'],
"last_name": last_name, "last_name": user_dict['last_name'],
"username": username, })
},
) 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 return user, created

View File

@ -4,9 +4,8 @@ from django.db import migrations
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
("core", "0003_create_users"), ("core", "0002_user_model"),
] ]
operations = [ operations = [

View File

@ -17,7 +17,7 @@ def create_users(apps, schema_editor):
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
("core", "0002_user_model"), ("core", "0004_user_sso_id"),
] ]
operations = [ operations = [

View File

@ -15,6 +15,7 @@ class User(AbstractUser):
# objects = UserManager() # objects = UserManager()
avatar_url = models.CharField(max_length=254, blank=True, default="") avatar_url = models.CharField(max_length=254, blank=True, default="")
email = models.EmailField("email address", unique=True) email = models.EmailField("email address", unique=True)
sso_id = models.UUIDField('SSO subscriber ID', unique=True, null=True, blank=True, default=None)
objects = UserManager() objects = UserManager()

View File

@ -1,3 +1,5 @@
import json
import structlog as structlog import structlog as structlog
from authlib.integrations.base_client import OAuthError from authlib.integrations.base_client import OAuthError
from django.conf import settings from django.conf import settings
@ -28,6 +30,7 @@ def authorize(request):
request request
) )
deocded_token = decode_jwt(token["id_token"]) deocded_token = decode_jwt(token["id_token"])
return HttpResponse(json.dumps(deocded_token))
except OAuthError as e: except OAuthError as e:
logger.error(f"OAuth error: {e}") logger.error(f"OAuth error: {e}")
if not settings.DEBUG: if not settings.DEBUG:
@ -54,4 +57,5 @@ def _user_data_from_token_data(token: dict) -> dict:
"last_name": token.get("family_name", ""), "last_name": token.get("family_name", ""),
"username": token.get("preferred_username", first_email), "username": token.get("preferred_username", first_email),
"email": first_email, "email": first_email,
"sub": token.get("sub")
} }