Hy在那里,我在这个项目中使用django-rest-kox进行令牌身份验证。我怀疑
1.如何使用在注册和登录时返回的令牌
(
当我像这样在邮递员中传递令牌时,
在标题部分
中
身份验证令牌abcjdkkfjjrhehrjlajn@kfjdk
(
这不适用于
2.当我调用logout和logoutall端点时,它会说,
{"细节":"未提供身份验证凭据"}
即使我通过了所有正确的证书。
这是我遵循的代码,
设置中.py
REST_FRAMEWORK = {
"DEFAULT_AUTHENTICATION_CLASSES": (
'knox.auth.TokenAuthentication',
"rest_framework.authentication.BasicAuthentication",
"rest_framework.authentication.SessionAuthentication",)}
REST_AUTH_TOKEN_MODEL = 'knox.models.AuthToken'
REST_AUTH_TOKEN_CREATOR = 'users.authentication.create_knox_token'
REST_AUTH_SERIALIZERS = {
'USER_DETAILS_SERIALIZER': 'users.serializers.CustomUserSerializer',
'TOKEN_SERIALIZER': 'users.serializers.KnoxSerializer'
}
在urls.py 中
path('auth/register/',KnoxRegisterView.as_view(),name='register'),
path('auth/login/',KnoxLoginView.as_view(),name='login'),
path('api/auth/logout/',knox_view.LogoutView.as_view(),name='knox_login'),
path('api/auth/logoutall/',knox_view.LogoutAllView.as_view(),name='knox_alllogin'),
身份验证.py
from knox.models import AuthToken
def create_knox_token(token_model, user, serializer):
token = AuthToken.objects.create(user=user)
return token
在序列化程序中.py
class KnoxSerializer(serializers.Serializer):
"""
Serializer for Knox authentication.
"""
token=serializers.CharField()
user = CustomUserDetailsSettingsSerializer()
视图.py
class KnoxRegisterView(RegisterView):
def get_response_data(self, user):
return KnoxSerializer({'user': user, 'token': self.token}).data
def perform_create(self, serializer):
user = serializer.save(self.request)
self.token = create_knox_token(None, user, None)
complete_signup(self.request._request, user, allauth_settings.EMAIL_VERIFICATION, None)
return user
class KnoxLoginView(LoginView):
def get_response(self):
serializer_class = self.get_response_serializer()
data = {
'user': self.user,
'token': self.token
}
serializer = serializer_class(instance=data, context={'request': self.request})
return Response(serializer.data, status=200)
我不确定,但我认为您的问题是需要覆盖登录视图,这样它就不会请求身份验证。通常rest框架是这样设置的:
# setting.py
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
}
因此,您的框架认为它需要对所有视图进行身份验证,包括登录视图(当然这很愚蠢(。解决方案是将登录视图重写为文档注释:
如果它是您唯一的默认身份验证类,请记住覆盖knox的LoginView,否则它将无法工作,因为登录视图将需要身份验证令牌来生成新令牌,从而使其无法使用。
尝试添加到您的登录视图:
class KnoxLoginView(LoginView):
...
permission_classes = (permissions.AllowAny,)
...