Django REST Framework — один из самых популярных веб-фреймворков Django, который использовался для создания многих успешных проектов. Он предоставляет простой удобный интерфейс для проектирования API и веб-сервисов JSON, что весьма популярно среди стартапов. При работе с фреймворком REST в Python существует несколько способов реализации модной аутентификации типа JSON Web Token (JWT). Мы обсудим подробности реализации в этой статье для новичков под катом.
JWT — это закодированная строка JSON, которая передается в заголовках для аутентификации запросов. Обычно она получается путем хеширования данных JSON с помощью секретного ключа. Это означает, что серверу не нужно каждый раз запрашивать базу данных, чтобы получить пользователя, связанного с данным токеном.
Когда пользователь успешно входит в систему, используя свои учетные данные, получается JSON Web Token, который сохраняется в локальном хранилище (тот самый JWT). Всякий раз, когда пользователь хочет получить доступ к защищенному URL, маркер отправляется в заголовке запроса. Затем сервер проверяет наличие действительного JWT в заголовке Authorization, и если он найден, пользователю будет разрешен доступ.
Типичный заголовок содержимого выглядит следующим образом:
Authorization: Bearer gdh676hghu
А вот общая символическая схема взаимодействия:
Перечислим не все, но только некоторые преимущества:
Django REST framework (DRF) является открытым исходным кодом, зрелой и хорошо поддерживаемой библиотекой Python/Django, которая нацелена на создание сложных веб-интерфейсов. Это гибкий и полнофункциональный инструментарий с модульной и настраиваемой архитектурой, позволяющий разрабатывать как простые, готовые конечные точки API, так и сложные REST-конструкции.
HTTP Accept
.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. Decode Error
(Decode JWT runtime error), если секрет неверен.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.
Прокси (proxy), или прокси-сервер — это программа-посредник, которая обеспечивает соединение между пользователем и интернет-ресурсом. Принцип…
Согласитесь, было бы неплохо соединить в одно сайт и приложение для смартфона. Если вы еще…
Повсеместное распространение смартфонов привело к огромному спросу на мобильные игры и приложения. Миллиарды пользователей гаджетов…
В перечне популярных чат-ботов с искусственным интеллектом Google Bard (Gemini) еще не пользуется такой популярностью…
Скрипт (англ. — сценарий), — это небольшая программа, как правило, для веб-интерфейса, выполняющая определенную задачу.…
Дедлайн (от англ. deadline — «крайний срок») — это конечная дата стачи проекта или задачи…