JWT в Django REST Framework — подробное руководство
В этом руководстве вы узнаете, как использовать аутентификацию JSON Web Token(JWT) для RESTful API.
- Что такое JWT?
- Структура токена JWT
- Интеграция JWT в приложение Django REST Framework
- Получение токенов
Что такое JWT?
Предположим, у вас есть секретный код, который вы и ваш друг используете для обмена сообщениями. Этот код позволяет вашему другу доверять тому, что сообщения действительно от вас. Это потому, что только вы и ваш друг знаете код. В мире Web API JWT(JSON Web Token) работает похожим образом.
JWT — это своего рода цифровая «идентификационная карта», которую клиент и сервер используют для проверки личности без необходимости хранить конфиденциальную информацию, такую как имя пользователя/пароль. JWT позволяет клиенту и серверу безопасно обмениваться информацией между клиентом и сервером.
Представьте, что вы входите в мобильное приложение. После того, как вы введете действительное имя пользователя и пароль, сервер создаст для вас JWT.
JWT включает ваш идентификатор пользователя и может также содержать другую информацию. Сервер отправляет JWT обратно в ваше мобильное приложение.
Всякий раз, когда вы хотите получить доступ к защищенной части приложения, вы представляете этот JWT. Сервер проверяет подпись, чтобы подтвердить ее подлинность, и считывает информацию, чтобы определить, кто вы и к чему вы можете получить доступ
Структура токена JWT
Токен JWT имеет следующую структуру:
- Header (Заголовок) — включает тип токена, т. е. JWT, и используемый алгоритм подписи.
- Payload (Полезная нагрузка) — это место, где JWT хранит определенную информацию, такую как идентификатор пользователя, срок действия и т. д. Думайте об этом как о личных данных вашего удостоверения личности.
- Signature (Подпись) – подпись создается с использованием заголовка, полезной нагрузки и секретного ключа, который известен только серверу. Это гарантирует, что информация в токене не будет подделана.
Например, ниже показан токен JWT:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjkyNzc4MzQxLCJpYXQiOjE2OTI3NzgwNDEsImp0aSI6IjljODVmMTU4MzIzMzQwOTViYTkxZTNlM2Q2MDA0MWU3IiwidXNlcl9pZCI6MX0.Y1uOK_rxp6_kvDmuULxc82kXgKZPrWsTuLh0Wvg3_Cs
Если вы скопируете токен в закодированную часть сайта jwt.io, вы увидите три части его структуры:
Если вы измените токен JWT(добавите или удалите символы), приложение проверит подпись и покажет результат:
Интеграция JWT в приложение Django REST Framework
- Сначала установите пакет djangorestframework-simplejwt в текущую виртуальную среду:
pip install djangorestframework-simplejwt
- Во-вторых, добавьте rest_framework_simplejwt в INSTALLED_APPS файла settings.py проекта:
INSTALLED_APPS = [ ..., 'rest_framework_simplejwt', ... ]
- В-третьих, настройте проект для использования библиотеки, добавив rest_framework_simplejwt.authentication.JWTAuthentication в список классов аутентификации в файле settings.py:
REST_FRAMEWORK = { ... 'DEFAULT_AUTHENTICATION_CLASSES':( ... 'rest_framework_simplejwt.authentication.JWTAuthentication', ) ... }
- В-четвертых, импортируйте два представления TokenObtainPairView и TokenRefreshView из rest_framework_simplejwt.views в urls.py проекта и настройте две конечные точки API соответственно:
from django.contrib import admin from django.urls import path, include # jwt from rest_framework_simplejwt.views import( TokenObtainPairView, TokenRefreshView, ) urlpatterns = [ path('admin/', admin.site.urls), path('api/v1/', include('api.urls')), path("auth/", include("rest_framework.urls")), # jwt path('api/v1/token/', TokenObtainPairView.as_view(), name='token_obtain_pair'), path('api/v1/token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), ]
Конечная точка api/v1/token/ позволяет вам указать действительное имя пользователя и пароль для получения пары токенов:
- Access token
- Refresh token
Получив токен доступа, вы можете добавить его в заголовок HTTP-запроса для вызова других API. Когда срок действия токена доступа истек, вы можете вызвать конечную точку API api/v1/token/refresh/, чтобы получить новый токен доступа.
Получение токенов
Чтобы получить пару токенов, вам нужно войти в систему, используя действительные имя пользователя и пароль. Откройте конечную точку api/v1/token/ в веб-браузере, вы увидите следующую страницу:
После того, как вы введете действительное имя пользователя и пароль и нажмете кнопку «POST»:
вы получите следующий ответ:
HTTP 200 OK Allow: POST, OPTIONS Content-Type: application/json Vary: Accept { "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTY5Mjg2NDQ0MSwiaWF0IjoxNjkyNzc4MDQxLCJqdGkiOiJhM2E2MTcyYjZmYjY0YzFlOGJjZGUyMDQ0MjgyNDkwZCIsInVzZXJfaWQiOjF9.8WxI_HcKkm5z6Gx3kCPzpNIkx4nBP52tdiw7-GJv9tA", "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjkyNzc4MzQxLCJpYXQiOjE2OTI3NzgwNDEsImp0aSI6IjljODVmMTU4MzIzMzQwOTViYTkxZTNlM2Q2MDA0MWU3IiwidXNlcl9pZCI6MX0.Q_-5AqFxbo1n2sQOOfcdd6ly8XFVT8wJNE-2TQph2ac" }
Теперь вы можете использовать токен доступа для вызова других API без необходимости повторного указания имени пользователя и пароля.
Например, мы можем использовать Postman для вызова API с конечной точкой api/v1/todos/, чтобы получить все задачи следующим образом:
Он возвращает задачи пользователя с именем John, которое мы используем для входа в систему и получения токенов.
Когда срок действия токена доступа истек, вам необходимо вызвать конечную точку API /api/v1/token/refresh/ с токеном обновления, чтобы получить новый токен доступа.
Откройте конечную точку /api/v1/token/refresh/ в веб-браузере и введите токен обновления, нажмите кнопку POST:
Вернется новый токен доступа:
HTTP 200 OK Allow: POST, OPTIONS Content-Type: application/json Vary: Accept { "access": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNjkyNzgzMDk0LCJpYXQiOjE2OTI3NzgwNDEsImp0aSI6IjFiNGRiYjgzZjRhMzRkYTlhMTgzNTY0MzY5M2MxNmQ0IiwidXNlcl9pZCI6MX0.lJeACjeegwoK_SE1NpmXBvKLNEvmahER8Eq-pZ71g7I" }
И вы можете использовать новый токен доступа для доступа к защищенной части приложения.