JWT в Django REST Framework — подробное руководство

В этом руководстве вы узнаете, как использовать аутентификацию JSON Web Token(JWT) для RESTful API.

Содержание

Что такое 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(добавите или удалите символы), приложение проверит подпись и покажет результат:

Изменение токена 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/ в веб-браузере, вы увидите следующую страницу:

Пример открытия конечной точки 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/, чтобы получить все задачи следующим образом:

Использование 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"
}

И вы можете использовать новый токен доступа для доступа к защищенной части приложения.

Похожие посты
Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *