Джосер для 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-адреса приложения, которые мы будем обслуживать для проверки подлинности. Для этого мы собираемся получить помощь от DjoserURL ссылки и 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/ и т.п.

Что я вижу, что djoser добавляет некоторую дополнительную конечную точку UserViewset по умолчанию, в основном вам может не понравиться это, вы должны включить то, что вам действительно нужно.
Другие вопросы по тегам