From fc18f93ff8bdcf426b2a97f70fe2c76762e706da Mon Sep 17 00:00:00 2001 From: Yohann D'ANELLO Date: Mon, 16 Nov 2020 04:00:23 +0100 Subject: [PATCH] Automatically register users --- lg/models.py | 26 ++++++++++++++++++++++++-- lglog/middlewares.py | 18 +++++++++++++++--- lglog/settings.py | 5 ++++- lglog/templates/base.html | 5 +++++ lglog/templates/index.html | 2 -- 5 files changed, 48 insertions(+), 8 deletions(-) diff --git a/lg/models.py b/lg/models.py index d9c0e6a..101aef9 100644 --- a/lg/models.py +++ b/lg/models.py @@ -1,12 +1,34 @@ -from django.contrib.auth.models import User +from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.translation import gettext_lazy as _ from polymorphic.models import PolymorphicModel +class DiscordUser(AbstractUser): + discord_id = models.CharField( + max_length=32, + primary_key=True, + verbose_name=_("discord id"), + ) + + discriminator = models.CharField( + max_length=4, + verbose_name=_("discriminator"), + ) + + avatar_id = models.CharField( + max_length=32, + verbose_name=_("avatar id"), + ) + + @property + def avatar_url(self): + return f"https://cdn.discordapp.com/avatars/{self.discord_id}/{self.avatar_id}.png" + + class Player(PolymorphicModel): user = models.OneToOneField( - User, + DiscordUser, on_delete=models.CASCADE, verbose_name=_("user"), ) diff --git a/lglog/middlewares.py b/lglog/middlewares.py index 2664a53..0af198a 100644 --- a/lglog/middlewares.py +++ b/lglog/middlewares.py @@ -2,9 +2,12 @@ from authlib.integrations.base_client import OAuthError from authlib.integrations.django_client import OAuth from authlib.oauth2.rfc6749 import OAuth2Token from django.conf import settings +from django.contrib.auth import login from django.shortcuts import redirect from django.utils.deprecation import MiddlewareMixin +from lg.models import DiscordUser + class OAuthMiddleware(MiddlewareMixin): @@ -37,6 +40,7 @@ class OAuthMiddleware(MiddlewareMixin): if request.session.get('token', None) is not None: current_user = self.get_current_user(sso_client, request) + login(request, current_user) if current_user is not None: return self.get_response(request) @@ -54,13 +58,21 @@ class OAuthMiddleware(MiddlewareMixin): return None if not OAuth2Token.from_dict(token).is_expired() and 'user' in request.session: - return request.session['user'] + return DiscordUser.objects.get(discord_id=request.session['user']) try: res = sso_client.get(settings.OAUTH_CLIENT['userinfo_endpoint'], token=OAuth2Token(token)) if res.ok: - request.session['user'] = res.json() - return res.json() + user_json = res.json() + discord_id = user_json['id'] + user, _ = DiscordUser.objects.get_or_create(discord_id=discord_id) + user.username = user_json['username'] + user.discriminator = user_json['discriminator'] + user.email = user_json['email'] + user.avatar_id = user_json['avatar'] + user.save() + request.session['user'] = user.discord_id + return user raise Exception(res, str(res.__dict__)) except OAuthError as e: print(e) diff --git a/lglog/settings.py b/lglog/settings.py index 4d169db..5d6b598 100644 --- a/lglog/settings.py +++ b/lglog/settings.py @@ -141,8 +141,11 @@ CRISPY_TEMPLATE_PACK = 'bootstrap4' DJANGO_TABLES2_TEMPLATE = 'django_tables2/bootstrap4.html' +AUTH_USER_MODEL = 'lg.discorduser' + # OAuth Settings -OAUTH_URL_WHITELISTS = [] +OAUTH_URL_WHITELISTS = [ +] OAUTH_CLIENT_NAME = 'discord' diff --git a/lglog/templates/base.html b/lglog/templates/base.html index f2ab89c..2834b5d 100644 --- a/lglog/templates/base.html +++ b/lglog/templates/base.html @@ -49,6 +49,11 @@
{% block fullcontent %}
diff --git a/lglog/templates/index.html b/lglog/templates/index.html index 1d25068..b49cc26 100644 --- a/lglog/templates/index.html +++ b/lglog/templates/index.html @@ -6,6 +6,4 @@ {% block content %} Historique de loup-garou - - {{ request.session.user }} {% endblock %}