首页 > 解决方案 > django-rest-framework 中的 JWT 身份验证问题

问题描述

我在使用 django-rest-knox 进行 JWT 身份验证时遇到问题。

错误是: Detail: Authentication credentials were not provided.

端点: /api/auth/login/

对端点的 POST 请求中的标头: { Content-Type: application/json }

身体:

{
    "username": "admin",
    "password": 1234
}

登录 API 视图:

class UserLoginAPIView(generics.GenericAPIView):
    serializer_class = UserLoginSerializer

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

序列化器:

class UserLoginSerializer(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("Invalid Credentials")

默认设置:

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'knox.auth.TokenAuthentication',
    ]
}

标签: pythondjangoapidjango-rest-framework

解决方案


我认为你的程序是错误的。根据 Knox 文档,您需要授予访问权限登录端点。但是您没有授予访问登录端点的权限。所以你的登录端点看起来像这样,

# views.py 
from django.contrib.auth import login
from rest_framework import permissions
from rest_framework.authtoken.serializers import AuthTokenSerializer
from knox.views import LoginView as KnoxLoginView

class LoginView(KnoxLoginView):
    permission_classes = (permissions.AllowAny,)

    def post(self, request, format=None):
        serializer = AuthTokenSerializer(data=request.data)
        serializer.is_valid(raise_exception=True)
        user = serializer.validated_data['user']
        login(request, user)
        return super(LoginView, self).post(request, format=None)

# settings.py 
REST_KNOX = {
  'USER_SERIALIZER': 'knox.serializers.UserSerializer',
}

如果您在设置中使用用户序列化程序,您将获得带有请求用户用户名的令牌,如下所示

{"user":{"username":"admin"},"token":"00bd2a5e517800b75a8f36bbf3baea4c839169108b25a5a5ea599a4ecda974c0"}

更多细节在这里。诺克斯


推荐阅读