django-rest-framework 中 JWT 身份验证的问题 [英] Problem with JWT authentication in django-rest-framework

查看:34
本文介绍了django-rest-framework 中 JWT 身份验证的问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I have a problem with JWT authentication using django-rest-knox.

错误是: 详细信息:未提供身份验证凭据.

终点: /api/auth/login/

发送到端点的 POST 请求中的标头:<代码>{内容类型:应用程序/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',
    ]
}

推荐答案

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

I think your procedure is wrong. According to Knox documents, You need to give an access permission login endpoint. But you did not give permission to access your login endpoint. So your login endpoint looks like this,

# 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',
}

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

If you use the user serializer in your setting you get token with the username of the requesting user like bellow

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

此处有更多详细信息.诺克斯

这篇关于django-rest-framework 中 JWT 身份验证的问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆