0

我正在使用内置用户模型和 knox 令牌身份验证在 Django 中构建用户身份验证。通过邮递员,我可以创建一个新用户,该用户正确返回该用户的用户名和唯一令牌。但是,当我尝试使用正确的用户名和密码信息访问我的登录路径时,它会返回 400 Bad Request 以及我的验证错误消息“凭据不正确”。知道为什么会发生这种情况吗?

下面是我的登录序列化程序、api 和 url 路径。

# Login Serializer in serializers.py

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

class LoginSerializer(serializers.Serializer):
    username = serializers.CharField()
    password = serializers.CharField()

    def validate(self, data):
        user = authenticate(**data)
        if user and user.is_active:
            return user
        raise serializers.ValidationError('Incorrect Credentials')
# Login API in api.py

from rest_framework import generics
from rest_framework.response import Response
from knox.models import AuthToken
from .serializers import LoginSerializer

class LoginAPI(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]
        })
from django.urls import path, include
from .api import RegisterAPI, LoginAPI, UserAPI
from knox import views as knox_views

urlpatterns = {
    path('auth', include('knox.urls')),
    path('auth/register', RegisterAPI.as_view()),
    path('auth/login', LoginAPI.as_view()),
    path('auth/user', UserAPI.as_view()),
    path('auth/logout', knox_views.LogoutView.as_view(), name='knox_logout'),
}

我会注意到,include('knox.urls')如果发生任何类似的路径名问题并且仍然收到相同的问题,我会尝试将该部分移动到我的 url 路径的底部。

4

1 回答 1

1

我知道现在已经很晚了,但如果它会帮助某人,我会很高兴。解决这个问题的方法是更改​​ rest 框架默认的身份验证类。如果您使用 knox 生成令牌,那么将'knox.auth.TokenAuthentication',默认身份验证类添加到 REST_FRAMEWORK 变量应该可以解决问题。该变量位于您的settings.py文件中。你最终会得到这样的东西:

   REST_FRAMEWORK = {
       'DEFAULT_AUTHENTICATION_CLASSES': (
           'knox.auth.TokenAuthentication',
       ),
   }
于 2020-12-07T18:57:11.147 回答