mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-26 09:16:10 -06:00
Close #12870 - Expand the TokenProvision API to include All Token values
This commit is contained in:
parent
4d686e8162
commit
9e2b2e1ba4
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user