我正在尝试将djoser与令牌身份验证一起使用,但使用django-rest-knox令牌。
我已将TOKEN_MODEL
设置为knox.models.AuthToken
,其余框架的DEFAULT_AUTHENTICATION_CLASSES
设置为knox.auth.TokenAuthentication
。
我很天真地认为这足够了,但是似乎Djoser的内置序列化器(创建令牌和令牌)不能与knox令牌一起正常工作。我尝试使用自定义序列化程序覆盖它们,但是我什么也没得到(这并不是说不可能,只是因为我对此很不好)。
我想到也许我应该尝试使用Knox自己的登录视图...这可能吗,或者不能那样混合吗? (我主要是问,因为我不想让它“工作”,但发现我这样做确实引入了安全漏洞。)
设置:
DJOSER = {
"TOKEN_MODEL": "knox.models.AuthToken",
"SERIALIZERS": {"token": "users.serializers.TokenSerializer"},
}
users.serializers.TokenSerializer的位置为:
class TokenSerializer(serializers.ModelSerializer):
auth_token = serializers.CharField(source="token_key")
class Meta:
model = settings.TOKEN_MODEL
fields = ("auth_token",)
仅对原始Djoser TokenSerializer进行了一些修改。抛出错误,表明AuthToken对象没有key
属性。 Knox令牌似乎将其称为token_key
,因此我替换了以下行:
auth_token = serializers.CharField(source="key")
与auth_token = serializers.CharField(source="token_key")
现在,它不会引发错误,但是会返回一个空令牌。检查实际的数据库表明它已使用正确的用户和创建时间保存了令牌,但摘要,salt和token_key的值为“ null”
答案 0 :(得分:0)
是的,可以混合使用Djoser
和knox
的其他观点。为此,我们将创建一个应用程序名称auth
,从该处我们将为所有与身份验证相关的端点提供服务。现在我们的项目结构就像
MainProject
-auth
--__init__.py
--urls.py
-mainapp
....
现在,在我们的auth
应用的网址中,我们将提供进行身份验证所需的端点。为此,我们将从Djoser
的网址link和Knox
的网址link中寻求帮助
而我们的auth的urls.py将类似于
from django.conf.urls import url, include
from django.contrib.auth import get_user_model
from djoser import views as djsoer_views
from knox import views as knox_views
from rest_framework.routers import DefaultRouter
router = DefaultRouter()
router.register('users', djsoer_views.UserViewSet)
User = get_user_model()
djoser_urlpatterns = [
url(
r'^users/create/?$',
djsoer_views.UserCreateView.as_view(),
name='user-create'
),
url(
r'^users/delete/?$',
djsoer_views.UserDeleteView.as_view(),
name='user-delete'
),
url(
r'^users/activate/?$',
djsoer_views.ActivationView.as_view(),
name='user-activate'
),
url(
r'^{0}/?$'.format(User.USERNAME_FIELD),
djsoer_views.SetUsernameView.as_view(),
name='set_username'
),
url(r'^password/?$', djsoer_views.SetPasswordView.as_view(), name='set_password'),
url(
r'^password/reset/?$',
djsoer_views.PasswordResetView.as_view(),
name='password_reset'
),
url(
r'^password/reset/confirm/?$',
djsoer_views.PasswordResetConfirmView.as_view(),
name='password_reset_confirm'
),
url(r'^$', djsoer_views.RootView.as_view(), name='root'),
url(r'^', include(router.urls)), ### If you want to add user view set
]
knox_urlpatterns = [
url(r'login/', knox_views.LoginView.as_view(), name='knox_login'),
url(r'logout/', knox_views.LogoutView.as_view(), name='knox_logout'),
url(r'logoutall/', knox_views.LogoutAllView.as_view(), name='knox_logoutall'),
]
urlpatterns = knox_urlpatterns + djoser_urlpatterns
现在,我们要在main_app的网址下添加此网址
from django.urls import path
from django.conf import settings
auth_urls = include('auth.urls')
urlpatterns = [
path('api/auth/', auth_urls),
......
]
现在,我们将能够访问每个端点,例如以api/auth/login/
登录或以api/auth/user/create/
创建用户等。