Close #12870 - Expand the TokenProvision API to include All Token values

This commit is contained in:
Luke Anderson 2023-06-15 17:46:15 +09:30
parent 4d686e8162
commit 9e2b2e1ba4

View File

@ -3,7 +3,7 @@ from django.contrib.auth.models import Group, User
from django.db.models import Count from django.db.models import Count
from drf_spectacular.utils import extend_schema from drf_spectacular.utils import extend_schema
from drf_spectacular.types import OpenApiTypes from drf_spectacular.types import OpenApiTypes
from rest_framework.exceptions import AuthenticationFailed from rest_framework.exceptions import AuthenticationFailed, ValidationError
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.routers import APIRootView from rest_framework.routers import APIRootView
@ -72,23 +72,32 @@ class TokenProvisionView(APIView):
# @extend_schema(methods=["post"], responses={201: serializers.TokenSerializer}) # @extend_schema(methods=["post"], responses={201: serializers.TokenSerializer})
def post(self, request): def post(self, request):
serializer = serializers.TokenProvisionSerializer(data=request.data) tokenprovision_serializer = serializers.TokenProvisionSerializer(data=request.data)
serializer.is_valid() tokenprovision_serializer.is_valid()
# Authenticate the user account based on the provided credentials # Authenticate the user account based on the provided credentials
username = serializer.data.get('username') username = tokenprovision_serializer.data.get('username')
password = serializer.data.get('password') password = tokenprovision_serializer.data.get('password')
if not username or not password: if not username or not password:
raise AuthenticationFailed("Username and password must be provided to provision a token.") raise AuthenticationFailed("Username and password must be provided to provision a token.")
user = authenticate(request=request, username=username, password=password) user = authenticate(request=request, username=username, password=password)
if user is None: if user is None:
raise AuthenticationFailed("Invalid username/password") raise AuthenticationFailed("Invalid username/password")
# Create a new Token for the User # Inject the user into the request
token = Token(user=user) request.data["user"] = user.id
request.user = user
token_serializer = serializers.TokenSerializer(data=request.data, context={'request': request})
if not token_serializer.is_valid():
raise ValidationError("Invalid token data provided")
# Create the new token
token = token_serializer.create(validated_data=token_serializer.validated_data)
token.save() token.save()
# Manually append the token key to the returned data, which is normally write-only
data = serializers.TokenSerializer(token, context={'request': request}).data data = serializers.TokenSerializer(token, context={'request': request}).data
# Manually append the token key, which is normally write-only
data['key'] = token.key data['key'] = token.key
return Response(data, status=HTTP_201_CREATED) return Response(data, status=HTTP_201_CREATED)