Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Python

JWT Аутентификация в Django

by
Difficulty:IntermediateLength:MediumLanguages:

Russian (Pусский) translation by Anna k.Ivanova (you can also view the original English article)

В этой статье содержится введение в JSON Web Tokens (JWT) и руководство как реализовать JWT-аутентификацию в Django.

Что такое JWT?

JWT - это закодированная строка JSON, которая передается в заголовках для аутентификации запросов. Обычно она создается путем хэширования данных JSON с помощью секретного ключа. Это означает, что серверу не нужно каждый раз запрашивать базу данных, чтобы получить пользователя, связанного с данным токеном.

Как работают веб-маркеры JSON

Когда пользователь успешно выполняет вход в систему с использованием своих учетных данных, создается пользовательский токен JSON и сохраняется в локальном хранилище. Всякий раз, когда пользователь хочет получить доступ к защищенному URL-адресу, токен отправляется в заголовке запроса. Затем сервер проверяет правильность JWT в заголовке авторизации, и если он валидный, пользователю будет разрешен доступ.

Содержимое заголовка обычно выглядит так:

Authorization: Bearer eyJhbGciOiJIUzI1NiIsI

Ниже приведена диаграмма, показывающая этот процесс:

How JSON Web Tokens Work

Концепция аутентификации и авторизации

Аутентификация - это процесс идентификации зарегистрированного пользователя, а авторизация - это процесс определения того, имеет ли определенный пользователь право доступа к веб-ресурсу.

Пример API

В этом учебном пособии мы собираемся создать простую систему аутентификации пользователей в Django, используя JWT в качестве механизма аутентификации.

Требования

  • Джанго
  • Python

Давайте начнем.

Создайте каталог, в котором вы будете содержать свой проект, а также виртуальную среду для установки зависимостей проекта.

Активируйте виртуальную среду:

Создайте проект Django.

Установите DRF и django-rest-framework-jwt, используя pip.

Давайте продолжим и добавим DRF в список установленных приложений в файле settings.py.

Настройка параметров JWT

Чтобы использовать JWT, нам нужно настроить разрешения django-rest-framework для принятия JSON Web Tokens.

В файле settings.py добавьте следующие конфигурации:

Создайте новое приложение users, которое будет обрабатывать аутентификацию и управление пользователями.

Добавьте приложение users в список установленных приложений в файле settings.py.

Настройка базы данных

Мы собираемся использовать базу данных PostgreSQL, потому что она более стабильна и надежна.

Создайте базу данных auth и назначьте пользователя.

Перейдите на учетную запись Postgres на вашем компьютере, набрав:

Зайдите в оболочку Postgres и создайте базу данных:

Создайте роль:

Предоставьте доступ к базе данных для пользователя:

Установите пакет psycopg2, который позволит нам использовать настроенную нами базу данных:

Отредактируйте текущую базу данных SQLite и используйте базу данных Postgres.

Создание моделей

Django поставляется со встроенной системой аутентификации, которая очень сложна, но иногда нам нужно внести коррективы, и, следовательно, нам нужно создать собственную систему аутентификации пользователей. Наша модель пользователя будет наследоваться от класса AbstractBaseUser, предоставляемого django.contrib.auth.models.

В users/models.py мы начинаем с создания модели User для хранения деталей пользователя.

REQUIRED_FIELDS содержит все обязательные поля в вашей модели пользователя, кроме поля имени пользователя и пароля, поскольку эти поля всегда будут запрашиваться.

UserManager - это класс, определяющий методы create_user и createuperuser. Этот класс должен предшествовать классу AbstractBaseUser, который мы определили выше. Давайте продолжим и определим это.

Миграции

Миграции предоставляют способ обновления вашей схемы базы данных каждый раз, когда ваши модели меняются, не теряя при этом данные.

Создайте первоначальную миграцию для модели наших пользователей и выполните синхронизацию базы данных.

Создание суперпользователя

Создайте суперпользователя, выполнив следующую команду:

Создание новых пользователей

Давайте создадим ендпоинт, чтобы разрешить регистрацию новых пользователей. Мы начнем с сериализации полей модели пользователя. Сериализаторы предоставляют способ изменения данных в форме, которую легче понять, например, JSON или XML. Десериализация делает обратное, преобразуя данные в форму, которая может быть сохранена в базе данных.

Создайте users/serializers.py и добавьте следующий код.

CreateUserAPIView

Затем мы хотим создать представление, чтобы у клиента был URL-адрес для создания новых пользователей.

В user.views.py добавьте следующее:

Мы устанавливаем allow_classes в (AllowAny,), чтобы разрешить любому пользователю (прошедшему проверку подлинности или нет) доступ к этому URL-адресу.

Настройка URL-адресов

Создайте файл users/urls.py и добавьте URL-адрес в соответствие с созданным нами представлением. Также добавьте следующий код.

Нам также нужно импортировать URL-адреса из приложения-пользователя в основной файл django_auth/urls.py. Так что делаем это и двигаемся дальше. Мы используем здесь функцию include , поэтому не забудьте ее импортировать.

Теперь, когда мы закончили создание ендпоинта, давайте  протестируем его. Для тестов мы будем использовать Postman. Если вы не знакомы с Postman, это инструмент, который представляет дружественный графический интерфейс для построения запросов и чтения ответов.

Configuring URLs

Как вы можете видеть выше, ендпоинт работает так, как ожидалось.

Аутентификация пользователей

Мы будем использовать модуль Django-REST Framework JWT Python, который мы установили в начале этого руководства. Он добавляет поддержку JWT-аутентификации для приложений Django Rest Framework.

Но сначала давайте определим некоторые параметры конфигурации для наших токенов и как они сгенерированы в файле settings.py.

  • JWT_VERIFY: он вызовет jwt.DecodeError, если секрет неправильный.
  • JWT_VERIFY_EXPIRATION: Устанавливает истечение срока действия в True, то есть токены истекают через некоторое время. Время по умолчанию - пять минут.
  • JWT_AUTH_HEADER_PREFIX: Префикс значения заголовка авторизации, который требуется отправить вместе с токеном. Мы установили его как Bearer, а по умолчанию - JWT.

В users/views.py добавьте следующий код.

В приведенном выше коде в окне входа в систему вводится имя пользователя и пароль, а затем создается токен с информацией пользователя, соответствующей переданным учетным данным, в качестве пейлоада и возвращается в браузер. Другие данные пользователя, такие как имя, также возвращаются в браузер вместе с токеном. Этот токен будет использоваться для аутентификации в будущих запросах.

Классы разрешений устанавливаются в allowAny, поскольку любой пользователь может получить доступ к этому ендпоинту.

Мы также сохраняем последнее время входа пользователя с этим кодом.

Каждый раз, когда пользователь хочет сделать запрос API, он должен отправить токен в заголовках Auth, чтобы аутентифицировать запрос.

Давайте протестируем этот ендпоинт с помощью Postman. Откройте Postman и используйте запрос для аутентификации с одним из пользователей, которых вы создали ранее. Если попытка входа в систему выполнена успешно, ответ будет выглядеть следующим образом:

A sample response

Получение и обновление пользователей

Пока пользователи могут зарегистрироваться и пройти проверку подлинности. Тем не менее, так же нужно предоставить способ получения и обновления этой информации. Давайте реализуем это.

В файле user.views.py добавьте следующий код.

Сначала мы определяем классы разрешений и устанавливаем IsAuthenticated, так как это защищенный URL-адрес, и к нему могут обращаться только прошедшие проверку подлинности пользователи.

Затем мы определяем метод get для получения сведений о пользователе. После получения сведений о пользователе аутентифицированный пользователь затем по желанию обновит свои данные.

Обновите URL-адреса, чтобы определить ендпоинт следующим образом.

Чтобы запрос был успешным, заголовки должны содержать  JWT токен, как показано ниже.

Headers with the JWT Token

Если вы попытаетесь запросить ресурс без заголовка проверки подлинности, вы получите следующую ошибку.

An example error

Если пользователь не делает запросов дольше времени, указанного в JWT_EXPIRATION_DELTA, то токен истекает, и ему придется запросить другой токен. Это также показано ниже.

JWT_EXPIRATION_DELTA Example

Заключение

В этом руководстве описано, что необходимо для успешного создания надежной системы аутентификации с помощью JSON Web Tokens.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.