Как проще всего интегрировать JWT в REST-фреймворк Python Django?
Django REST Framework — один из самых популярных веб-фреймворков Django, который использовался для создания многих успешных проектов. Он предоставляет простой удобный интерфейс для проектирования API и веб-сервисов JSON, что весьма популярно среди стартапов. При работе с фреймворком REST в Python существует несколько способов реализации модной аутентификации типа JSON Web Token (JWT). Мы обсудим подробности реализации в этой статье для новичков под катом.
Что такое JWT?
JWT — это закодированная строка JSON, которая передается в заголовках для аутентификации запросов. Обычно она получается путем хеширования данных JSON с помощью секретного ключа. Это означает, что серверу не нужно каждый раз запрашивать базу данных, чтобы получить пользователя, связанного с данным токеном.
Принцип работы веб-маркеров JSON
Когда пользователь успешно входит в систему, используя свои учетные данные, получается JSON Web Token, который сохраняется в локальном хранилище (тот самый JWT). Всякий раз, когда пользователь хочет получить доступ к защищенному URL, маркер отправляется в заголовке запроса. Затем сервер проверяет наличие действительного JWT в заголовке Authorization, и если он найден, пользователю будет разрешен доступ.
Типичный заголовок содержимого выглядит следующим образом:
Authorization: Bearer gdh676hghu
А вот общая символическая схема взаимодействия:
Преимущества JWT Auth
Перечислим не все, но только некоторые преимущества:
- Отсутствие необходимости управлять сессией (без статичности).
- Портативный.
- Не требует куки, поэтому очень удобен для мобильных устройств.
- Хорошая производительность.
- JWT помогает в обеспечении безопасности API.
Django REST Framework
Django REST framework (DRF) является открытым исходным кодом, зрелой и хорошо поддерживаемой библиотекой Python/Django, которая нацелена на создание сложных веб-интерфейсов. Это гибкий и полнофункциональный инструментарий с модульной и настраиваемой архитектурой, позволяющий разрабатывать как простые, готовые конечные точки API, так и сложные REST-конструкции.
Основные преимущества Django REST Framework
- Простота, гибкость, качество и тестовое покрытие исходного кода.
- Мощный механизм сериализации, совместимый как с ORM, так и с не ORM источниками данных.
- Подключаемые и легко настраиваемые эмиттеры, парсеры, валидаторы и аутентификаторы.
- Общие классы для операций CRUD.
- Чистые, простые представления для Ресурсов, использующие новые представления Django, основанные на классах.
- Поддержка модельных ресурсов с готовыми реализациями по умолчанию и валидацией ввода (опциональная поддержка форм в качестве валидации ввода).
- Обработка HTTP-ответов, согласование типа содержимого с помощью заголовков
HTTP Accept.
Реализация JWT в Django REST Framework
Django REST Framework поставляется с различными классами аутентификации по умолчанию. Базовая аутентификация, сеансовая аутентификация, аутентификация с помощью токенов и другие.
Аутентификация на основе токенов является наиболее предпочтительным методом реализации аутентификации в современных API. В этом механизме сервер генерирует токен для аутентифицированного пользователя, и пользователь должен отправлять токен JWT вместе со всеми HTTP-запросами, чтобы идентифицировать себя.
Установите DRF и Django-rest-framework-jwt с помощью pip:
pip install djangorestframework pip install djangorestframework-jwt pip install django
Для того чтобы использовать JWT, нам необходимо настроить разрешения Django-rest-framework на прием JSON Web Tokens.
В файл settings.py добавьте следующие конфигурации:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
),
}
Теперь добавьте конечную точку JWT API в файл settings.py, как показано ниже:
from django.urls import path, include
from rest_framework_simplejwt import views as jwt_views
urlpatterns = [
path('api/token/',
jwt_views.TokenObtainPairView.as_view(),
name ='token_obtain_pair'),
path('api/token/refresh/',
jwt_views.TokenRefreshView.as_view(),
name ='token_refresh'),
path('', include('app.urls')),
]
Указанная выше конечная точка будет использоваться для генерации и обновления токена JWT при каждом вызове API.
Мы будем использовать модуль Django-REST Framework JWT Python, который мы установили в начале этого руководства. Он добавляет поддержку аутентификации JWT для приложений Django Rest Framework.
Давайте определим некоторые параметры конфигурации для наших токенов и способ их генерации в файле settings.py.
import datetime
JWT_AUTH = {
'JWT_VERIFY': True,
'JWT_VERIFY_EXPIRATION': True,
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=3000),
'JWT_AUTH_HEADER_PREFIX': 'Bearer',
}
Перечислим частые варианты ошибок:
- JWT_VERIFY: Возникнет ошибка
jwt. Decode Error(Decode JWT runtime error), если секрет неверен. - JWT_VERIFY_EXPIRATION: Устанавливает срок действия на True, что означает, что срок действия токенов истечет через определенный период времени. По умолчанию это время составляет пять минут.
- JWT_AUTH_HEADER_PREFIX: Префикс значения заголовка авторизации, который должен быть отправлен вместе с токеном. Мы задали его как
Bearer, а по умолчанию это JWT.
Теперь вы можете использовать полезную нагрузку JWT в своем методе аутентификации. Перейдите в файл views.py и добавьте следующий код:
def authenticate_user(request):
email = request.data['email']
password = request.data['password']
user = User.objects.get(email=email, password=password)
if user:
payload = jwt_payload_handler(user)
token = jwt.encode(payload, settings.SECRET_KEY)
user_details = {}
user_details['name'] = "%s %s" % ( user.first_name, user.last_name)
user_details['token'] = token
user_logged_in.send(sender=user.__class__,request=request, user=user)
return Response(user_details, status=status.HTTP_200_OK)
Каждый раз, когда пользователь хочет сделать запрос к API, он должен отправить токен в заголовках auth, чтобы аутентифицировать запрос. Вы можете протестировать конечную точку API с помощью Postman или любого другого инструмента тестирования API.
Вы можете проверить токен JWT с помощью любого из инструментов тестирования API, например Postman. Ниже приведен скриншот использования Postman для вызова JWT API:
Вы можете найти весь исходный код демонстрационного проекта вот здесь, на Github.
Заключение
Подведем наши итоги, вот главное что мы узнали.
JWT — лучший способ безопасного обмена информацией между front-end и back-end, поскольку они могут быть подписаны, а значит, мы можем быть уверены, что отправители являются теми, за кого себя выдают. Структура JWT позволяет нам проверить, что содержимое не было подделано.
JWT значительно упрощает процесс аутентификации пользователей в интернете, предоставляя более простой способ обмена информацией между сервером и клиентом. У него много преимуществ (часть которых перечислили выше), но в добавку можно добавить еще следующий важный факт: здесь нет никаких обращений к базе данных! Общеизвестно, что для большинства API сетевые вызовы вносят наибольшую задержку. Следовательно, разумно ожидать, что отсутствие сетевых вызовов (отсутствие обращений к базе данных) для проверки сеанса будет весьма полезным.
Django REST Framework — это суперпопулярный RESTful framework для разработки приложений Django. Она предоставляет высокоуровневое представление о том, как разрабатывать RESTful веб-сервисы в Django. Это удобный инструмент/база для быстрой реализации JWT.




Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: