Учетные данные для аутентификации не были предоставлены при регистрации

Создание API Django, чтобы помочь мне обрабатывать процесс регистрации и входа для моего приложения React.

Я могу успешно войти в систему (получить токен доступа и обновления от Django при входе), но испытываю трудности с подключением моего процесса регистрации React к Django для создания нового пользователя.

Вот ошибка, которую я получаю на консоли:

POST http://127.0.0.1:8000/users/ 401 (Unauthorized)
onSubmit @ Signup.js:32

и в моей сети:

Authentication credentials were not provided.

Вот что у меня есть в моем serializers.py

from django.contrib.auth.models import User
from rest_framework import serializers

class RegisterSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username', 'email', 'password']
        extra_kwargs = {
            'password': {'write_only':True},
        }
        def create(self,validated_data):
            user = User.objects.create_user(validated_data['username'],
                                            password=validated_data['password'],
                                            email=validated_data['email'])
            return user

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = '__all__'

class UserSerializerWithToken(serializers.ModelSerializer):
    token = serializers.SerializerMethodField()
    password = serializers.CharField(write_only=True)


class PasswordSerializer(serializers.Serializer):
    old_password = serializers.CharField(required=True)
    new_password = serializers.CharField(required=True)

accounts.urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/', include('signup.urls')),
]

signup.urls.py

from django.contrib import admin
from django.urls import path, include
from rest_framework import routers
from . import views
from rest_framework_simplejwt.views import (TokenObtainPairView, TokenRefreshView, TokenVerifyView)
from .api import RegisterApi

router = routers.DefaultRouter()
router.register(r'users', views.UserViewSet)

urlpatterns = [
    path('', include(router.urls)),
    path('admin/', admin.site.urls),
    path('api-auth/', include('rest_framework.urls', namespace='rest_framework')),
    path('api/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('api/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('api/token/verify/', TokenVerifyView.as_view(), name='token_verify'),
    path('api/register', RegisterApi.as_view()),
]

и, наконец, signup.views.py:

from django.contrib.auth.models import User, Group
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework import viewsets, status
from rest_framework import permissions
from .serializers import RegisterSerializer, PasswordSerializer


class UserViewSet(viewsets.ModelViewSet):
    """
    API endpoint that allows users to be viewed or edited.
    """
    queryset = User.objects.all().order_by('-date_joined')
    #changed name from UserSerializer to RegisterSerializer
    serializer_class = RegisterSerializer
    # permission_classes = [permissions.IsAuthenticated]

    @action(detail=True, methods=['POST'])
    def set_password(self, request, pk=None):
        user = self.get_object()
        serializer = PasswordSerializer(data=request.data)

        if serializer.is_valid():
            user.set_password(serializer.validated_data['new_password'])
            user.save()
            return Response({'status': 'password set'})
        else:
            return Response(serializer.errors,
                            status=status.HTTP_400_BAD_REQUEST)

В процессе регистрации я обращаюсь к этому URL-адресу:

'http://127.0.0.1:8000/api/register'

Причина этого в том, что у вас есть схема аутентификации/разрешений по умолчанию, которая применяется ко всем вашим представлениям. Однако ваш процесс регистрации (возможно, по понятным причинам) не аутентифицирован, поскольку на данном этапе нет учетной записи пользователя для авторизации.

Одним из способов обойти это может быть разрешение анонимной регистрации, не требуя разрешений для создания пользователя, если это желаемое поведение для вашего приложения.

from rest_framework.permissions import AllowAny
class UserViewSet(viewsets.ModelViewSet):
    ...
    def get_permissions(self):
        """
        dont require permissions for create actions
        otherwise, follow normal required permissions
        """
        if self.action == 'create':
            return [AllowAny()]
        else:
            return super().get_permissions()
Вернуться на верх