从django-rest-kox登录或注册后返回令牌有什么用



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,)
...

最新更新