Джосер для DRF с жетонами Нокса
Я пытаюсь использовать 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
приписывать. Жетоны Нокса, кажется, называют это token_key
поэтому я заменил строку:auth_token = serializers.CharField(source="key")
с auth_token = serializers.CharField(source="token_key")
Теперь он не выдает ошибку, но возвращает пустой токен. Проверка действительной базы данных показывает, что она сохранила токен с правильным пользователем и временем создания, но с нулем для digest, salt и token_key
1 ответ
Да, можно смешивать Djoser
и knox
Дополнительная точка зрения. Для этого мы собираемся создать имя приложения auth
откуда мы будем обслуживать все связанные с аутентификацией конечные точки. Теперь структура нашего проекта
MainProject
-auth
--__init__.py
--urls.py
-mainapp
....
Сейчас в нашем auth
URL-адреса приложения, которые мы будем обслуживать для проверки подлинности. Для этого мы собираемся получить помощь от Djoser
URL ссылки и Knox
ссылка URL-адреса А URL-адрес нашего автора будет выглядеть следующим образом
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
Теперь мы собираемся добавить этот URL под URL нашего 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/
и т.п.