DRF: как интегрировать django-rest-framework-jwt в Djoser

Я планирую создать приложение с помощью Django Rest Framework. Меня больше интересует механизм аутентификации Django-Rest-Framework-JWT, чем механизм аутентификации Session или Token.

Но все другие пакеты, такие как Django-Rest-Auth и Djoser (который помогает в процессе регистрации), используют систему аутентификации сеанса и токена.

Как переопределить механизм аутентификации токена в Djoser или Django-Rest-Auth с помощью Django-Rest-Framework-JWT?


person nabeel    schedule 29.04.2015    source источник


Ответы (1)


Я знаю, что этому вопросу почти год, но я только что понял, как заставить Djoser и django-rest-knox подыгрывать, и, конечно же, тот же метод работал с djangorestframework-jwt. Уловка заключается в том, чтобы знать, что вы можете использовать конечные точки учетной записи Djoser без использования конечных точек, связанных с авторизацией. Вам просто нужно разместить каждую библиотеку на отдельной конечной точке.

Вот как я настроил Django Rest Framework для использования JWT для входа в систему и аутентификации на конечных точках Djoser (я собираюсь пройти это от начала до конца):

Сначала установите djangorestframework-jwt и djoser:

pip install djangorestframework-jwt djoser

Укажите, что вы хотите использовать JWT для аутентификации, добавив JSONWebTokenAuthentication в DEFAULT_AUTHENTICATION_CLASSES в settings.py вашего проекта Django:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}

Затем добавьте представление djoser.urls и rest_framework_jwt obtain_jwt_token к своим URL-адресам:

from django.conf.urls import url, include
from rest_framework_jwt import views as jwt_views

urlpatterns = [
    url(r'^account/', include('djoser.urls')),
    url(r'^auth/login/', jwt_views.obtain_jwt_token, name='auth'),
]

Это должно быть все, что вам нужно для начала. На всякий случай запустите migrate (я создал совершенно новый экземпляр Django Rest Framework для этого поста и до этого момента еще не выполнял начальные коммиты):

python manage.py migrate

Чтобы проверить ситуацию, создайте нового пользователя, если у вас его еще нет:

python manage.py createsuperuser

Если у вас есть учетная запись пользователя, runserver, а затем попробуйте войти в систему, чтобы получить свой JWT:

http POST http://localhost:800/auth/login/ имя пользователя = пароль администратора = пароль

Вы должны получить обратно токен:

{
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM"
}

Затем вы можете использовать этот токен для аутентификации на конечной точке Djoser / me /, чтобы получить информацию вашего профиля. Просто укажите свой токен в заголовке запроса как Авторизация: JWT:

HTTP HTTP: // локальный: 8000 / счет / мне / "Авторизация: JWT eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE0NTg2ODI3MzYsInVzZXJuYW1lIjoiYWRtaW4iLCJlbWFpbCI6IiIsInVzZXJfaWQiOjJ9.JDoVCpfiE0uGhsv9OQfPgPc-wxjjQtcEjwAI6bTLWRM"

Вот что я получил в ответ:

{
    "email": "",
    "id": 2,
    "username": "admin"
}

Как видите, начать использовать JWT для аутентификации довольно просто. Я предполагаю, что библиотеки, такие как djoser и django-rest-auth, ориентированы на базовую аутентификацию, аутентификацию сеанса или токена, потому что они включены из коробки DRF и, следовательно, вероятно наиболее распространенный метод, с помощью которого люди аутентифицируют вызовы своего сервера.

Прелесть всего этого в том, что легко реализовать более безопасную схему аутентификации, потому что Djoser не тесно связан со своими собственными классами аутентификации - он с радостью будет уважать все, что вы установили для DEFAULT_AUTHENTICATION_CLASSES.

person IAmKale    schedule 22.03.2016
comment
Djoser недавно получил поддержку JWT на основе djangorestframework-jwt - djoser.readthedocs.io / en / latest / и djoser. readthedocs.io/en/latest/ - person Peter Nimroot; 06.11.2017
comment
@IAmKale Я пытаюсь реализовать Djoser с аутентификацией токена Knox, но борюсь с URL-адресами и представлениями, чтобы заставить их работать вместе. Есть ли какой-нибудь учебник или руководство, которое может мне помочь? - person gagan chhabra; 06.02.2021
comment
@gagan У меня, к сожалению, нет хороших лидов, я не касался этих библиотек с тех пор, как изначально опубликовал этот ответ. Был ли этот другой ответ, который вы прокомментировали, бесполезным? Я думаю, это единственное, на что я мог бы связать вас после быстрого поиска: stackoverflow.com/a/54961526/2133271 - person IAmKale; 07.02.2021
comment
@IAmKale Сообщение, которое я прокомментировал, дало мне представление о том, как я могу объединить 2 пакета. Я начал с Djoser, успешно создал пользователя, установил Knox- ›сделал несколько настроек knox, и Djoser перестал работать. Теперь я никуда. Я пытаюсь выяснить, как эти 2 пакета влияют друг на друга и каковы обязательные зависимости / реализации / конфигурации, чтобы заставить их работать вместе (что мне, вероятно, не хватает). - person gagan chhabra; 07.02.2021