diff --git a/backend/src/openarchiefbeheer/api/urls.py b/backend/src/openarchiefbeheer/api/urls.py index 40c7b1fe..09ad8300 100644 --- a/backend/src/openarchiefbeheer/api/urls.py +++ b/backend/src/openarchiefbeheer/api/urls.py @@ -12,7 +12,7 @@ ReviewersView, WhoAmIView, ) -from openarchiefbeheer.config.api.views import ArchiveConfigView +from openarchiefbeheer.config.api.views import ArchiveConfigView, OIDCInfoView from openarchiefbeheer.destruction.api.views import ListStatusesListView from openarchiefbeheer.destruction.api.viewsets import ( DestructionListItemReviewViewSet, @@ -101,6 +101,7 @@ path( "archive-config", ArchiveConfigView.as_view(), name="archive-config" ), + path("oidc-info", OIDCInfoView.as_view(), name="oidc-info"), path( "_retrieve_zaken/", CacheZakenView.as_view(), name="retrieve-zaken" ), diff --git a/backend/src/openarchiefbeheer/conf/base.py b/backend/src/openarchiefbeheer/conf/base.py index 0128b680..6dc76d9c 100644 --- a/backend/src/openarchiefbeheer/conf/base.py +++ b/backend/src/openarchiefbeheer/conf/base.py @@ -632,4 +632,4 @@ # Django OIDC # OIDC_AUTHENTICATE_CLASS = "mozilla_django_oidc_db.views.OIDCAuthenticationRequestView" -OIDC_CALLBACK_CLASS = "mozilla_django_oidc_db.views.OIDCCallbackView" \ No newline at end of file +OIDC_CALLBACK_CLASS = "mozilla_django_oidc_db.views.OIDCCallbackView" diff --git a/backend/src/openarchiefbeheer/config/api/serializers.py b/backend/src/openarchiefbeheer/config/api/serializers.py index abf865bd..699202c7 100644 --- a/backend/src/openarchiefbeheer/config/api/serializers.py +++ b/backend/src/openarchiefbeheer/config/api/serializers.py @@ -1,4 +1,9 @@ +from django.utils.translation import gettext_lazy as _ + +from drf_spectacular.utils import extend_schema_field +from mozilla_django_oidc_db.models import OpenIDConnectConfig from rest_framework import serializers +from rest_framework.reverse import reverse from ..models import ArchiveConfig @@ -21,3 +26,27 @@ class Meta: "resultaattype": {"required": True, "allow_null": False}, "informatieobjecttype": {"required": True, "allow_null": False}, } + + +class OIDCInfoSerializer(serializers.ModelSerializer): + login_url = serializers.SerializerMethodField( + label=_("OIDC authentication URL"), + help_text=_( + "URL where to start the OIDC login flow if it is enabled. If it is not enabled, it will be an empty string." + ), + ) + + class Meta: + model = OpenIDConnectConfig + fields = ( + "enabled", + "login_url", + ) + + @extend_schema_field(serializers.URLField) + def get_login_url(self, config: OpenIDConnectConfig) -> str: + if not config.enabled: + return "" + + request = self.context.get("request") + return reverse("oidc_authentication_init", request=request) diff --git a/backend/src/openarchiefbeheer/config/api/views.py b/backend/src/openarchiefbeheer/config/api/views.py index 18192c56..16978d9e 100644 --- a/backend/src/openarchiefbeheer/config/api/views.py +++ b/backend/src/openarchiefbeheer/config/api/views.py @@ -1,13 +1,15 @@ from django.utils.translation import gettext_lazy as _ from drf_spectacular.utils import extend_schema +from mozilla_django_oidc_db.models import OpenIDConnectConfig +from rest_framework.request import Request from rest_framework.response import Response from rest_framework.views import APIView from openarchiefbeheer.destruction.api.permissions import CanStartDestructionPermission from ..models import ArchiveConfig -from .serializers import ArchiveConfigSerializer +from .serializers import ArchiveConfigSerializer, OIDCInfoSerializer class ArchiveConfigView(APIView): @@ -60,3 +62,21 @@ def put(self, request, *args, **kwargs) -> Response: ) def patch(self, request, *args, **kwargs) -> Response: return self.update(partial=True) + + +class OIDCInfoView(APIView): + authentication_classes = () + permission_classes = () + + @extend_schema( + summary=_("Retrieve OIDC info"), + description=_("Returns info about OIDC that is needed by the frontend. "), + tags=["Configuration"], + responses={ + 200: OIDCInfoSerializer, + }, + ) + def get(self, request: Request, *args, **kwargs): + config = OpenIDConnectConfig.get_solo() + serializer = OIDCInfoSerializer(instance=config, context={"request": request}) + return Response(serializer.data) diff --git a/backend/src/openarchiefbeheer/urls.py b/backend/src/openarchiefbeheer/urls.py index 89818b7a..e9bac69d 100644 --- a/backend/src/openarchiefbeheer/urls.py +++ b/backend/src/openarchiefbeheer/urls.py @@ -6,10 +6,10 @@ from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import include, path from django.views.generic.base import TemplateView -from mozilla_django_oidc_db.views import AdminLoginFailure from maykin_2fa import monkeypatch_admin from maykin_2fa.urls import urlpatterns, webauthn_urlpatterns +from mozilla_django_oidc_db.views import AdminLoginFailure from openarchiefbeheer.accounts.views.password_reset import PasswordResetView