diff --git a/requirements.txt b/requirements.txt index 4edebd6b0646bd3afbc9d5f613964dea13a26e24..a91f63d57c3079644b13d1ad135659ac67728414 100644 --- a/requirements.txt +++ b/requirements.txt @@ -11,3 +11,4 @@ pytest-django pytest-mock faker coverage +social-auth-app-django diff --git a/sage_validation/file_validator/views.py b/sage_validation/file_validator/views.py index e7c4002a2b40098f0be4fc2040bab3538d2908e4..9bea9c62dbbe4097776cb983ae8c3fdf94ea9b4a 100644 --- a/sage_validation/file_validator/views.py +++ b/sage_validation/file_validator/views.py @@ -7,6 +7,7 @@ from django.shortcuts import render from django.urls import reverse_lazy from django.utils import timezone from rest_framework import status +from rest_framework.permissions import IsAuthenticated from rest_framework.request import Request from rest_framework.response import Response from rest_framework.views import APIView @@ -28,6 +29,7 @@ def upload_page_view(request: HttpRequest) -> HttpResponse: class CSVUploadAPIView(APIView): """API view for uploading a CSV file.""" + permission_classes = [IsAuthenticated] def post(self, request: Request) -> Response: """Handle CSV upload and validation.""" diff --git a/sage_validation/settings.py b/sage_validation/settings.py index 8e1a0ff1a59f67f2b62dddd01f7dd7442b8d7950..dea87dfa91892f806ec417b7d6a81d138a115ee5 100644 --- a/sage_validation/settings.py +++ b/sage_validation/settings.py @@ -9,6 +9,7 @@ For the full list of settings and their values, see https://docs.djangoproject.com/en/5.1/ref/settings/ """ import os +from datetime import timedelta from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. @@ -27,6 +28,9 @@ ALLOWED_HOSTS: list[str] = os.getenv("ALLOWED_HOSTS", "").split(",") # Application definition INSTALLED_APPS = [ + "rest_framework", + "rest_framework.authtoken", + "social_django", "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", @@ -49,6 +53,7 @@ MIDDLEWARE = [ "django.middleware.csrf.CsrfViewMiddleware", "django.contrib.auth.middleware.AuthenticationMiddleware", "django.contrib.messages.middleware.MessageMiddleware", + "social_django.middleware.SocialAuthExceptionMiddleware", "django.middleware.clickjacking.XFrameOptionsMiddleware", ] @@ -65,6 +70,8 @@ TEMPLATES = [ "django.template.context_processors.request", "django.contrib.auth.context_processors.auth", "django.contrib.messages.context_processors.messages", + 'social_django.context_processors.backends', + 'social_django.context_processors.login_redirect', ], }, }, @@ -147,3 +154,17 @@ MEDIA_ROOT = os.getenv("MEDIA_ROOT", BASE_DIR / "media") MEDIA_URL = '/media/' CSRF_TRUSTED_ORIGINS = os.getenv("CSRF_TRUSTED_ORIGINS", "").split(",") +AUTHENTICATION_BACKENDS = ( + "social_core.backends.google.GoogleOAuth2", + "django.contrib.auth.backends.ModelBackend", +) + +SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = "323196535105-k0dqcfcusmrvb99iok1pui978age9bb8.apps.googleusercontent.com" +SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = "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" + +SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = ["email", "profile"] +SOCIAL_AUTH_GOOGLE_OAUTH2_REDIRECT_URI = "http://localhost:8000/complete/google-oauth2/" +SOCIAL_AUTH_JSONFIELD_ENABLED = True +SOCIAL_AUTH_URL_NAMESPACE = 'social' +LOGIN_REDIRECT_URL = "/" +SOCIAL_AUTH_ALLOW_DISCONNECT = True \ No newline at end of file diff --git a/sage_validation/templates/base.html b/sage_validation/templates/base.html index 20f3c23d95c69128f00d91f7a9e74061ec522528..38f87f469a4eef03fc6c3e6485c877e00e6d3420 100644 --- a/sage_validation/templates/base.html +++ b/sage_validation/templates/base.html @@ -18,7 +18,16 @@ <a href="{% url "index" %}" class="text-white text-2xl font-bold tracking-wide">Sage Validation</a> <!-- Made title clickable --> </div> <div class="flex items-center"> <!-- Login link --> - <a href="/login" class="text-white hover:text-gray-300">Login</a> + {% if user.is_authenticated %} + <p class="text-white">Welcome, {{ user.username }}!</p> + {# <a href="{% url 'social:disconnect' 'google-oauth2' %}" class="text-white hover:text-gray-300">Logout</a>#} +{# <form action="{% url 'social:disconnect' 'google-oauth2' %}" method="post">#} +{# {% csrf_token %}#} +{# <button type="submit">Logout</button>#} +{# </form>#} + {% else %} + <a href="{% url "social:begin" "google-oauth2" %}" class="text-white hover:text-gray-300">Login</a> + {% endif %} <button id="mobile-menu-button" class="md:hidden text-white focus:outline-none ml-4"> <svg class="h-6 w-6" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> <path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M4 6h16M4 12h16m-7 6h7"></path> diff --git a/sage_validation/urls.py b/sage_validation/urls.py index af6d6158c155dd64a21c7170bb90f05d1fc7020d..f839b99fab7178d94eebbc22b43e4d2306dd9db3 100644 --- a/sage_validation/urls.py +++ b/sage_validation/urls.py @@ -9,5 +9,6 @@ urlpatterns = [ path("admin/", admin.site.urls), path("file-validator/", include("sage_validation.file_validator.urls")), path("", index_view, name="index"), + path("", include("social_django.urls", namespace="social")) ]