Личный кабинет пользователя в Django

Custom permissions¶

To create custom permissions for a given model object, use the permissionsmodel Meta attribute.

Django oauth toolkit

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

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-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 не требует использования базы данных для проверки токена.

Sessionauthentication

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

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

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

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

— Jacob Kaplan-Moss, «REST worst practices»

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

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

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

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

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

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

Аутентификация пользователя в django (loginview)

По умолчанию, Django поставляется с представлением LoginView для страницы входа. Нам нужно только настроить:

  • URL маршруты для системы аутентификации;
  • создать HTML шаблон для страницы входа;
  • обновить файл settings.py.

Для начала обновим файл blog_project/urls.py. Поместим страницы для входа и для выхода на URL префиксе accounts. Небольшое добавление на предпоследней строке.

Как отмечается в документации к LoginView, по умолчанию Django будет искать файл login.html в папке registration. Таким образом, нам нужно создать новую директорию под названием registration, а внутри нее создать необходимый HTML файл шаблона.

Теперь наполните файл следующим контентом:

Выход пользователя из профиля на django

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

В файле шаблона base.html добавим ссылку {% url ‘logout’ %} для выхода сразу после приветствия пользователя.

Вот и все, что от нас требуется, ведь само представление предоставляется приложением auth от Django. Правда, нам нужно уточнить, куда именно пользователь будет направлен после выхода из профиля.

Обновим settings.py для создания ссылки перенаправления, которая будет называться LOGOUT_REDIRECT_URL. Мы можем добавить ее рядом с ссылкой для входа, таким образом файл должен выглядеть следующим образом:

При обновлении домашней страницы можно увидеть, что у вошедших пользователей появилась ссылка для выхода «Log out«.

Домашняя страница с ссылкой для выхода

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

Домашняя страница вышедшего пользователя

Попробуйте зайти и выйти несколько раз с вашим аккаунтом.

Данные пользователя на главной странице | is_authenticated

Обновим шаблон base.html таким образом, чтобы пользователи могли увидеть сообщение вне зависимости от того, прошли они аутентификацию или нет. Для этого будем использовать атрибут is_authenticated.

Теперь нужно просто разместить следующий код в нужном месте нашего шаблона. Обновим файл base.html, вставив новый код под закрывающимся тегом </header>.

После аутентификации, система поприветствует пользователя. В противном случае вы будете перенаправлены на страницу аутентификации.

Домашняя страница после аутентификации

Все сработало! Мое имя суперпользователя — wsv. Именно его я вижу на главной странице.

Загружаем изменения на github

С нашего последнего git коммита прошло много времени. Давайте выполним коммит, а затем загрузим копию кода на GitHub. Для начала посмотрим на всю выполненную работу через команду git status.

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

Создайте новое хранилище на GitHub, назвав его по своему усмотрению. Я выбрал название blog-app. После создания нового хранилища на GitHub можно выполнить следующие две команды. Не забудьте поменять в коде мое имя пользователя stillriverpress на свой никнейм.

Все готово! Теперь можно разместить новое приложение на Heroku.

Запускаем django блог на heroku

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

Затем введите команду create, которая говорит Heroku, что нужно сделать контейнер, в котором будет работать наше новое приложение. Если выполнить команду heroku create, то Heroku выдаст вам случайное имя суб-домена. Однако вы также можете настроить свое собственное имя суб-домена, только оно должно быть уникальным на Heroku.

Теперь настроим git, чтобы при размещении на Heroku было присвоено название вашего нового приложения (заменяете dfb-blog на выбранное вами название).

Остался еще один этап — нужно разобраться со статическими файлами, которые в нашем случае это CSS стили. На этапе продакшена Django не поддерживает оперирование статическими файлами, для этого можно использовать WhiteNoise. Давайте установим его.

Далее нам нужно обновить статические настройки для дальнейшей работы в продакшене. Через текстовый редактор откройте файл settings.py. Добавьте whitenoise к INSTALLED_APPS над встроенным приложением staticfiles, а также в переменой MIDDLEWARE на третьей строке. Порядок имеет значение как для INSTALLED_APPS, так и для MIDDLEWARE.

В нижней части файла добавьте новые строки кода для STATIC_ROOT и STATICFILES_STORAGE. Все должно выглядеть следующим образом.

Не забудьте добавить и закоммитить все новые изменения. Затем обновите проект на GitHub.

Наконец-то можно разместить код на Heroku и убедиться в том, что веб-приложение работает должным образом.

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

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

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

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

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

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

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

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

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

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

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

Authorization: Bearer eyJhbGciOiJIUzI1NiIsI

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

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

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

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

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

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

Миграции

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

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

Настраиваем heroku для блога на django

Сейчас мы опубликуем приложение на Heroku уже в третий раз. Как и в случае с приложением доски объявления на Django, для использования Heroku потребуется сделать четыре изменения в файлах нашего блога.

Уточняем Python версию в Pipfile, затем выполняем команду pipenv lock что приведет к созданию файлаPipfile.lock. Создаем файл Procfile, который является файлом конфигурации Heroku, устанавливаем gunicorn в качестве веб-сервера вместо локального веб-сервера Django и в конечном итоге обновляем переменную ALLOWED_HOSTS, чтобы приложение было видно каждому на просторе интернета.

Откройте файл Pipfile в текстовом редакторе и в нижней части добавьте две строчки:

Здесь мы указываем версию 3.7 вместо более точного 3.7.3. Приложение автоматически подстроится под текущую версию Python 3.7.x на Heroku.

Теперь запустите команду pipenv lock для обновления файла Pipfile.lock, так как Heroku использует его для генерации виртуального окружения на серверах Heroku для нашего приложения.

Создается новый файл Procfile.

Через текстовый редактор в Procfile добавьте следующую строчку:

Таким образом Heroku будет знать, что надо использовать Gunicorn в качестве веб-сервера, а не локальный веб-сервер от Django.

Теперь устанавливаем Gunicorn.

Наконец-то можно обновить переменную ALLOWED_HOSTS для разрешения всех доменов.

Теперь можно закоммитить новые изменения и перенести все на GitHub.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Требования

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

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

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

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

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

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

pip install django-oauth-toolkit

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

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

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

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

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

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

Заключение

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

Handling authorization in custom backends¶

Custom auth backends can provide their own permissions.

Похожее:  Аутентификация с модулем requests в Python.