django 当我注销时,我发现这个错误“详细信息”:“未提供身份验证凭据,”

goucqfw6  于 2023-04-13  发布在  Go
关注(0)|答案(2)|浏览(133)

我正在使用django-rest-knox,当我使用knox_views.LogoutAllView.as_view()注销时,它给了我这个错误:

"detail": "Authentication credentials were not provided."

注意:我使用的是自定义用户模型(AbstarctUserBaseUserManager
下面是serializers.py

class UserSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ('id', 'username', 'email','birth_date','first_name','last_name')

# there is a registerserializer too

class LoginSerializer(serializers.Serializer):
    email = serializers.EmailField()
    password = serializers.CharField()

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError("Incorrect Credentials")

下面是views.py

class LoginView(generics.GenericAPIView):
    serializer_class = LoginSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user= serializer.validated_data
        return Response({
            "user": UserSerializer(user, context=self.get_serializer_context()).data,
            "token": AuthToken.objects.create(user)[1]
        })

class RegisterAPI(generics.GenericAPIView):
    serializer_class = RegisterSerializer

    def post(self, request, *args, **kwargs):
        serializer = self.get_serializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.save()
        return Response({
        "user": UserSerializer(user, context=self.get_serializer_context()).data,
        "token": AuthToken.objects.create(user)[1]
        })
nhaq1z21

nhaq1z211#

从文档:
此视图仅接受正文为空的post请求。它响应Knox令牌验证。在成功的请求中,用于验证的令牌以及注册到同一用户帐户的所有其他令牌将从系统中删除,并且不能再用于验证。
这意味着您仍然需要使用在与注销端点进行身份验证时生成的令牌。

ego6inou

ego6inou2#

你必须在新的logout视图中显式覆盖authentication_classes或者从Django设置中调用它

class MyCustomLogoutView(LogoutView)
    authentication_classes = (Your custom Authentication,)

from rest_framework.settings import api_settings

class MyCustomLogoutView(LogoutView)
        authentication_classes = api_settings.DEFAULT_AUTHENTICATION_CLASSES

或者直接从Django设置中访问

相关问题