python - 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',
]
}
解决方案
我认为你的程序是错误的。根据 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"}
更多细节在这里。诺克斯
推荐阅读
- flutter - Flutter 国际化 intl_translate
- python - Python:ctypes 如何将 c_char_Array 转换为 c_char_p
- xamarin - Xamarin 图像和按钮
- angular - D3树在Angular中调整SVG大小
- python - IndexError:在 Python 3 但不是 Python 2 中引发的索引列表超出范围异常
- combobox - MFC 对话框未在下拉列表组合中显示资源选项字符串
- javascript - 调整窗口大小时如何抵消刮擦效果?
- amazon-iam - 空手道:签署 AWS HTTP 请求并将生成的标头添加到“请求标头”
- python - 连续多个值,只保留第一个
- amazon-web-services - 如何通过 SSM 访问 EMR Web 界面?