Рубріки: Теория

Как проще всего интегрировать 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.

Останні статті

Обучение Power BI – какие онлайн курсы аналитики выбрать

Сегодня мы поговорим о том, как выбрать лучшие курсы Power BI в Украине, особенно для…

13.01.2024

Work.ua назвал самые конкурентные вакансии в IТ за 2023 год

В 2023 году во всех крупнейших регионах конкуренция за вакансию выросла на 5–12%. Не исключением…

08.12.2023

Украинская IT-рекрутерка создала бесплатный трекер поиска работы

Unicorn Hunter/Talent Manager Лина Калиш создала бесплатный трекер поиска работы в Notion, систематизирующий все этапы…

07.12.2023

Mate academy отправит работников в 10-дневный оплачиваемый отпуск

Edtech-стартап Mate academy принял решение отправить своих работников в десятидневный отпуск – с 25 декабря…

07.12.2023

Переписки, фото, история браузера: киевский программист зарабатывал на шпионаже

Служба безопасности Украины задержала в Киеве 46-летнего программиста, который за деньги устанавливал шпионские программы и…

07.12.2023

Как вырасти до сеньйора? Девелопер создал популярную подборку на Github

IT-специалист Джордан Катлер создал и выложил на Github подборку разнообразных ресурсов, которые помогут достичь уровня…

07.12.2023