Джосер для DRF с жетонами Нокса - PullRequest
0 голосов
/ 02 марта 2019

Я пытаюсь использовать 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")

Теперь он не выдает ошибку, но возвращает пустой токен.Проверка действительной базы данных показывает, что он сохранил токен с правильным пользователем и временем создания, но с нулевым значением для дайджеста, соли и ключа токена

1 Ответ

0 голосов
/ 02 марта 2019

Да, возможно смешать дополнительные точки зрения Djoser и knox.Для этого мы собираемся создать имя приложения auth, из которого мы будем обслуживать все конечные точки, связанные с аутентификацией.Теперь структура нашего проекта похожа на

MainProject
   -auth
      --__init__.py
      --urls.py
    -mainapp
    ....

Теперь в URL нашего приложения auth мы будем обслуживать необходимые конечные точки для аутентификации.Для этого мы будем получать помощь от Djoser ссылок ссылки и Knox ссылок ссылки И наш URL-адрес auth.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

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