[Перевод] Аутентификация Веб-Токена Json В Django И Angularjs: Часть Первая

Самый распространенный метод аутентификации — аутентификация с использованием файлов cookie. Более современный метод аутентификации основан на использовании JSON Web Token (буквально: веб-токена в формате JSON) и быстро набирает популярность.

В этой статье мы остановимся на этом.



Что такое веб-токен JSON?

Маркеры на самом деле довольно простые.

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

Когда вас нанимала компания, вы подтверждали свою личность, предоставляя набор учетных данных, таких как водительские права или номер социального страхования.

В обмен на эти данные вам был выдан ключ (жетон), позволяющий находиться в здании.

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

Конечно, этот ключ может остаться у вас в кармане, но никакой пользы вам это не принесет. JSON Web Token — это простой токен специального формата.

Формат еще не стандартизирован, но многие уже используют одну из его реализаций ( JWT ).

JWT (произносится йот) состоит из трех частей:

  • Заголовок
  • Полезная нагрузка
  • Подпись
Давайте рассмотрим каждый из них, прежде чем углубиться в реализацию.



Заголовок

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

Тип токена хранится в ключе «typ».

Клавиша «typ» игнорируется в JWT (для этой статьи это не важно, но вы можете захотеть читать чтобы узнать почему).

Если присутствует ключ «typ», его значение должно быть JWT, чтобы указать, что этот объект является веб-токеном JSON. Второй ключ «alg» определяет алгоритм, используемый для шифрования токена.

По умолчанию должно быть установлено значение HS256. Существует ряд альтернативных алгоритмов, которые используются в различных реализациях.

Полный список с разбивкой по библиотекам можно найти на JWT.io. Заголовок кодируется в base64.

Полезная нагрузка

Полезная нагрузка хранит любую информацию, которую необходимо проверить.

Каждый ключ в полезных данных известен как «оператор».

Например, рассмотрим социальную сеть, к сообществу которой можно присоединиться только по приглашению.

Когда мы хотим пригласить кого-то в сообщество, мы отправляем ему электронное письмо с приглашением.

Здесь важно убедиться, что адрес электронной почты принадлежит лицу, принимающему приглашение, поэтому мы включим этот адрес в полезную нагрузку, сохранив его в ключе «email».

  
  
  
  
  
  
  
  
  
  
  
   

{ "email": "[email protected]" }

Ключи в полезной нагрузке могут быть произвольными.

Однако есть несколько зарезервированных, которые вам следует знать:

  • iat (выпущено).

    Этот ключ представляет время выдачи токена и может использоваться для определения возраста JWT. Ключ iat должен быть меткой времени в формате unix.

  • exp (время истечения срока действия).

    Этот ключ указывает, когда истечет срок действия токена.

    Стандартный

JWT требует, чтобы все его реализации отклоняли токены с истекшим сроком действия.

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

Ключ exp должен быть меткой времени в формате unix. Важно понимать, что полезная нагрузка не передается в зашифрованном виде (хотя токены могут быть вложенными, и тогда можно будет передавать зашифрованные данные).

Поэтому вы не сможете хранить в нем какую-либо секретную информацию.

Например, пароли, номера социального страхования и т. д. Как и заголовок, полезные данные закодированы в формате Base64.

Подпись

Получив заголовок и полезную нагрузку, мы можем вычислить подпись.

Заголовок и полезные данные в кодировке Base64 объединяются в строку, разделенную точкой.

Эта строка и секретный ключ затем вводятся в алгоритм шифрования, указанный в заголовке (ключ «alg»).

Ключом может быть любая строка.

Более длинные строки будут наиболее предпочтительными, поскольку для их выбора потребуется больше времени.



JWT

Теперь, когда у нас есть заголовок, полезные данные и подпись, мы можем построить JWT. Окончательный JWT выглядит так:

<encoded header>.

<encoded payload>.

<signature>

Примечание.

Никогда не храните токен в своей базе данных.

Поскольку действительный токен эквивалентен паролю, хранение токена аналогично хранению пароля в виде открытого текста.

Поэтому всегда используйте хеширование перед сохранением.



Реализация аутентификации с использованием веб-токена JSON

Давайте продолжим и создадим наш проект. Перейдите в каталог проекта и выполните команды:

$ django-admin.py startproject django_angular_token_auth $ cd django_angular_token_auth/ $ mkdir static templates

Вам необходимо убедиться, что настройки STATICFILES_DIRS и TEMPLATE_DIRS присутствуют в django_angular_token_auth/settings.py и они должны выглядеть следующим образом:

STATICFILES_DIRS = ( os.path.join(BASE_DIR, 'static'), ) TEMPLATE_DIRS = ( os.path.join(BASE_DIR, 'templates'), )



REST-фреймворк Джанго

Теперь вам нужно установить Django REST Framework. Django REST Framework — отличный проект с открытым исходным кодом для тех, кто хочет создавать одностраничные приложения и API для них.

Мы не будем вдаваться в подробности того, как работает Django REST Framework, поэтому, если вы с ней не знакомы, ознакомьтесь с документацией.

Чтобы установить Django REST Framework, выполните следующую команду:

$ pip install djangorestframework

Django REST Framework необходимо добавить в установленные приложения (INSTALLED_APPS в django_angular_token_auth/settings.py :)

INSTALLED_APPS = ( .

, 'rest_framework', )

Вам также необходимо добавить следующие параметры в django_angular_token_auth/settings.py:

REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', ), }

Мы не будем использовать SessionAuthentication или BasicAuthentication, но они доступны в Django REST Framework и предлагают работающий API «из коробки».



Django-rest-framework-jwt

Последнее, что вам нужно сделать, это установить django-rest-framework-jwt. Этот пакет обеспечивает поддержку JWT для Django REST Framework и использует реализацию PyJWT в качестве веб-токена JSON. Чтобы установить django-rest-framework-jwt, выполните следующую команду:

$ pip install djangorestframework-jwt

Вам нужно будет добавить следующие настройки в django_angular_token_auth/settings.py:

import datetime JWT_AUTH = { 'JWT_EXPIRATION_DELTA': datetime.timedelta(days=14) }

Этот параметр определяет срок действия наших токенов, и в нашем случае он будет составлять 14 дней.

Вы можете изменить его в соответствии со своими предпочтениями.

Вам также следует добавить обновленные настройки REST_FRAMEWORK:

REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.BasicAuthentication', 'rest_framework_jwt.authentication.JSONWebTokenAuthentication', ) }

Обратите внимание, что мы добавили: «rest_framework_jwt.authentication.JSONWebTokenAuthentication», в «DEFAULT_AUTHENTICATION_CLASSES».



Создание приложения Django

Теперь давайте создадим приложение Django для хранения в нем представлений и сериализаторов:

$ python manage.py startapp authentication

Давайте добавим «аутентификацию» в наши INSTALLED_APPS (в django_angular_token_auth/settings.py вот так):

INSTALLED_APPS = (

Теги: #django #angularjs #json web token #jwt #django #angular
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.