diff --git a/core/settings.py b/core/settings.py index 9def112..2584913 100644 --- a/core/settings.py +++ b/core/settings.py @@ -30,6 +30,7 @@ # SECURITY WARNING: don't run with debug turned on in production! DEBUG = os.environ.get("DEBUG") == "True" + ALLOWED_HOSTS = ( [ os.environ.get("DOMAIN", "*"), @@ -49,8 +50,13 @@ "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", + "django.contrib.sites", # third party apps "django_celery_beat", + "allauth", + "allauth.account", + "allauth.socialaccount", + "allauth.socialaccount.providers.github", # custom apps "tracker", ] @@ -63,6 +69,7 @@ "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", + "allauth.account.middleware.AccountMiddleware", ] ROOT_URLCONF = "core.urls" @@ -162,3 +169,35 @@ # Custom app settings DEFAULT_SCHEDULE_INTERVAL = 3600 + +# Django-Allauth settings +AUTHENTICATION_BACKENDS = ( + "django.contrib.auth.backends.ModelBackend", + "allauth.account.auth_backends.AuthenticationBackend", +) + +LOGIN_REDIRECT_URL = "/admin/" +ACCOUNT_LOGOUT_REDIRECT_URL = "/admin/" + +SITE_ID = int(os.environ.get("SITE_ID", 1)) + +SOCIAL_AUTH_GITHUB_KEY = os.environ.get("GITHUB_CLIENT_ID") +SOCIAL_AUTH_GITHUB_SECRET = os.environ.get("GITHUB_CLIENT_SECRET") + +SOCIALACCOUNT_PROVIDERS = { + "github": { + "SCOPE": ["read:user", "user:email"], + } +} + + +SOCIALACCOUNT_ADAPTER = "tracker.adapter.CustomSocialAccountAdapter" +SOCIALACCOUNT_LOGIN_ON_GET = True +SOCIALACCOUNT_STORE_TOKENS = True +SOCIALACCOUNT_QUERY_EMAIL = True + +ACCOUNT_EMAIL_VERIFICATION = "optional" +ACCOUNT_USER_MODEL_USERNAME_FIELD = None +ACCOUNT_AUTHENTICATION_METHOD = "email" +ACCOUNT_EMAIL_REQUIRED = True +ACCOUNT_USERNAME_REQUIRED = False diff --git a/core/urls.py b/core/urls.py index 137ac1b..6a597fe 100644 --- a/core/urls.py +++ b/core/urls.py @@ -23,4 +23,5 @@ urlpatterns = [ path("admin/", admin.site.urls), path("", include("tracker.urls")), + path("accounts/", include("allauth.urls")), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/pyproject.toml b/pyproject.toml index 032400c..20dfb86 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -21,6 +21,7 @@ celery = "^5.4.0" django-celery-beat = "^2.7.0" redis = "^5.2.0" faker = "^33.1.0" +django-allauth = "^65.3.1" [build-system] diff --git a/tracker/adapter.py b/tracker/adapter.py new file mode 100644 index 0000000..7f3040d --- /dev/null +++ b/tracker/adapter.py @@ -0,0 +1,21 @@ +from allauth.socialaccount.adapter import DefaultSocialAccountAdapter +from django.contrib.auth import get_user_model + + +User = get_user_model() + + +class CustomSocialAccountAdapter(DefaultSocialAccountAdapter): + def pre_social_login(self, request, sociallogin): + """ + Processes a login attempt before registration. + If a user with such an email exists, associates it with the social account. + """ + if not sociallogin.is_existing: + email = sociallogin.account.extra_data.get("email") + if email: + try: + user = User.objects.get(email=email) + sociallogin.connect(request, user) + except User.DoesNotExist: + pass diff --git a/tracker/templates/signup.html b/tracker/templates/signup.html index 8d19fe9..668a23c 100644 --- a/tracker/templates/signup.html +++ b/tracker/templates/signup.html @@ -1,4 +1,5 @@ {% load static %} +{% load socialaccount %} @@ -12,46 +13,103 @@ - - - {% if messages %} - - {% endif %} + + + +{% if messages %} + +{% endif %} + +
+ +
+ + +
+
+
+
+ +
+ + +
-
-
-
-
-
+ + + + +
-
-
-
+
+
+
+
- - - - - -