Django – Урок 017. Кастомизированная страница авторизации на Django

Apps.py

from django.apps import AppConfig


class AccountsConfig(AppConfig):
    name = 'accounts'

Django oauth toolkit

Пакет Django OAuth Toolkit обеспечивает поддержку OAuth 2.0 и работает с Python 3.4 . Пакет поддерживается Evonove и использует превосходную OAuthLib. Пакет хорошо документирован, хорошо поддерживается и в настоящее время является нашим рекомендуемым пакетом для поддержки OAuth 2.0.

Django rest framework

Теперь нужно установить 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 oauth

Пакет Django REST framework OAuth обеспечивает поддержку как OAuth1, так и OAuth2 для REST framework.

Этот пакет ранее был включен непосредственно в REST framework, но теперь поддерживается и поддерживается как сторонний пакет.

Django-rest-auth / dj-rest-auth

Эта библиотека предоставляет набор конечных точек REST API для регистрации, аутентификации (включая аутентификацию в социальных сетях), сброса пароля, получения и обновления сведений о пользователях и т. Д. Имея эти конечные точки API, ваши клиентские приложения, такие как AngularJS, iOS, Android и другие может независимо общаться с вашим серверным сайтом Django через REST API для управления пользователями.

На данный момент существует два форка этого проекта.

Django-rest-framework-jwt

Последнее, что нужно сделать, это установить django-rest-framework-jwt. Этот пакет обеспечивает поддержку JWT для Django REST Framework и в качестве JSON Web Token использует реализацию PyJWT. Что бы установить 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-rest-knox

Библиотека Django-rest-knox предоставляет модели и представления для обработки аутентификации на основе токенов более безопасным и расширяемым способом, чем встроенная схема TokenAuthentication – с учетом одностраничных приложений и мобильных клиентов.

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

Djoser

Библиотека Djoser предоставляет набор представлений для обработки основных действий, таких как регистрация, вход в систему, выход из системы, сброс пароля и активация учетной записи. Пакет работает с настраиваемой моделью пользователя и использует аутентификацию на основе токенов. Это готовая к использованию REST-реализация системы аутентификации Django.

Drfpasswordless

drfpasswordlessdrfpasswordless добавляет (Medium, Square Cash) поддержку без пароля к собственной схеме TokenAuthentication Django REST Framework. Пользователи входят в систему и регистрируются с помощью токена, отправленного в контактную точку, например, на адрес электронной почты или номер мобильного телефона.

Installation & configuration

Установите пакет с помощью pip.

pip install djangorestframework-oauth

Подробнее о настройке и использовании см. документацию OAuth фреймворка Django REST для аутентификации и permissions.

Json web token аутентификация

JSON Web Token – это довольно новый стандарт, который можно использовать для аутентификации на основе токенов. В отличие от встроенной схемы TokenAuthentication, JWT Authentication не требует использования базы данных для проверки токена.

Login.html

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

Login_widget.html


Напоминаю, что я использую

django_bootstrap3

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

Sessionauthentication

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

В случае успешной аутентификации SessionAuthentication предоставляет следующие учетные данные.

Settings.py

INSTALLED_APPS = [
    'accounts.apps.AccountsConfig',
]

Settings.py и apps.py

Не забудьте зарегистрировать модуль авторизаций в настройках сайта.

Urls.py файлы


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

Url-адреса

Теперь нужно настроить URL-адреса для нашего проекта.

Откройте django_angular_token_auth/urls.py и приведите его к следующему виду:

Views.py


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

Аутентификация

Аутентификация должна быть подключаемой.

— Jacob Kaplan-Moss, “REST worst practices”

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

REST framework предоставляет ряд схем аутентификации из коробки, а также позволяет реализовать собственные схемы.

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

Заголовок

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

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

, чтобы узнать почему). Если ключ «typ» присутствует, его значение должно быть JWT, чтобы указать, что этот объект является JSON Web Token.

Второй ключ «alg» определяет алгоритм, используемый для шифрования маркера. По умолчанию он должен быть установлен в HS256. Есть целый ряд альтернативных алгоритмов, которые используются в различных реализациях. Полный список с разбивкой по библиотекам можно посмотреть на JWT.io.

Заголовок кодируется в base64.

Используя команду django manage.py

Начиная с версии 3.6.4 можно сгенерировать токен пользователя с помощью следующей команды:

Эта команда вернет токен API для данного пользователя, создав его, если он не существует:

Если вы хотите перегенерировать токен (например, если он был взломан или случилась утечка), вы можете передать дополнительный параметр:

Используя сигналы

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

Обратите внимание, что вам нужно убедиться, что вы поместили этот фрагмент кода в установленный модуль models.py или в другое место, которое будет импортировано Django при запуске.

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

Конкретная конфигурация apache mod_wsgi

Обратите внимание, что при развертывании на Apache с использованием mod_wsgi заголовок авторизации не передается в приложение WSGI по умолчанию, поскольку предполагается, что аутентификация будет выполняться Apache, а не на уровне приложения.

Если вы выполняете развертывание в Apache и используете любую аутентификацию, не основанную на сеансе, вам необходимо явно настроить mod_wsgi для передачи требуемых заголовков в приложение. Это можно сделать, указав директиву WSGIPassAuthorization в соответствующем контексте и установив для нее значение ‘On’.

Несанкционированные и запрещенные ответы

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

Открывая эндпоинт api

При использовании TokenAuthentication вы можете захотеть предоставить клиентам механизм для получения токена с учетом имени пользователя и пароля. REST framework предоставляет встроенное представление для обеспечения такого поведения. Чтобы использовать его, добавьте представление obtain_auth_token в ваш URLconf:

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

Подпись

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

Берутся закодированные в base64: заголовок и полезная нагрузка, они объединяются в строку через точку. Затем эта строка и секретный ключ поступает на вход алгоритма шифрования, указанного в заголовке (ключ «alg»). Ключом может быть любая строка. Более длинные строки будут наиболее предпочтительнее, поскольку потребуется больше времени на подбор.

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

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

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

Ключи в полезной нагрузке могут быть произвольными. Тем не менее, есть несколько зарезервированных, которые нужно знать:

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

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

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

Как и заголовок, полезная нагрузка кодируется в base64.

Представления


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

Для наших целей нужно только одно представление, которое будет возвращать список объектов пользователя.

Django REST Framework предлагает целый ряд представлений, которые выполняют различные функции, например представление списка объектов одного типа. Такую функциональность предлагает класс ListAPIView.

Добавьте следующее в authentication/views.py:

Реализация проверки подлинности с помощью json web token


Давайте пойдем дальше и создадим наш проект.

Перейдите в каталог проекта и выполните команды:

Сериализаторы

Для проверки работоспособности API нужно отправлять какие-нибудь данные на AJAX запросы. Самый простой способ это сделать — отправить обратно данные пользователя в нашей системе.

Первое, что нужно сделать, это создать пользователя. Выполните следующую команду и следуйте инструкциям на экране:

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

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

$ python manage.py startapp authentication

Добавим ‘authentication’ в наш INSTALLED_APPS (в django_angular_token_auth/settings.py like so):

INSTALLED_APPS = (
	...,
	'rest_framework',
	'authentication',
)


Как привило после создания приложения нужно выполнить миграции, для создания моделей в БД. Но мы не будем создавать собственные модели, поэтому об этом не нужно беспокоиться.

Сторонние пакеты

Также доступны следующие сторонние пакеты.

Уставнока и настройка

Установите пакет с помощью pip.

pip install django-oauth-toolkit

Добавьте пакет в свой INSTALLED_APPS и измените настройки вашего REST framework.

Дополнительные сведения см. в документации Django REST framework – Начало работы.

Установка схемы аутентификации

Схемы аутентификации по умолчанию могут быть установлены глобально, используя настройку DEFAULT_AUTHENTICATION_CLASSES. Например:

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

Или, если вы используете декоратор @api_view с представлениями на основе функций.

Шаблоны


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

Создайте файл с именем templates/index.html и добавьте следующий код в него:

В дальнейшем мы добавим некоторый angular код в данный файл.

Похожее:  Пишем голосового ассистента на Python

Добавить комментарий

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