Аутентификация | Документация Django Rest Framework 3.12.4 | Все о фреймворке Джанго и его библиотеках

401 и 403 ответы

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

Create the serializer class

We shall add a serializer class for the Student model. The serializer class will convert student instances and QuerySets to and from JSON. Let us start off by creating a serilizers.py file inside the students application directory.

Navigate to the students folder and create make the serializers.py file using the command nano:

cd ~/drfauthproject/students/
nano serializers.py

Add the following lines of code to the file:

from rest_framework import serializers
from .models import Student


class StudentSerializer(serializers.ModelSerializer):

class Meta:
model = Student
fields = ('pk', 'first_name', 'last_name', 'email', 'classroom')

From the first two lines, we imported the serializers API from the Django REST framework and the Student model from the models.py file of the student application. We then created the CustomerSerializer class which extends the serializers.ModelSerializer to specify the specific fields to be serialized.

We then used the Meta class to define the model and fields to be serialized which are: pk, first_name, last_name, email, and class.

Now that we have created the serializer class for the Student model, we shall create the API views.

Creating the student model

The Student model represents the database table that will contain the students’ data. The Django Object Relational Mapper (ORM) handles database management for us by providing a Python interface for SQL operations. It maps the Python classes and variables in our models to corresponding SQL tables and columns. Hence we do not need to use SQL queries ourselves.

Похожее:  ЛИЧНЫЙ КАБИНЕТ ИНТЕРНЕТ МАГАЗИНА ВАЙЛДБЕРРИЗ ИНТЕРНЕТ МАГАЗИН ВОЙТИ

Navigate into the directory and open the models.py file inside with the nano command. You can learn more about GNU nano text editor for Unix-like systems from this How to Use Nano, the Linux Command Line Text Editor

cd ~/drfauthproject/students/
nano models.py

You will see that it contains the following lines:

from django.db import models
# Create your models here.

from django.db import models already imports the Student model’s API for us. Let us now add the Student class with the following fields:

Add the code for the Student model :

from django.db import models

class Student(models.Model):
first_name = models.CharField("First name", max_length=255)
last_name = models.CharField("Last name", max_length=255)
email = models.EmailField()
classroom = models.CharField("Classroom", max_length=20)

def __str__(self):
return self.first_name

In the code above, the Student class extends the models. Model from django.db.models.Model. The str() function tells how the model will be displaced. Here, we specified with a return statement that the student’s first name should be displayed. You can learn more about Django Models in this article, how to write Django models.

Now, we will migrate the database to create tables. We will use the makemigrations command to create migration files where the model changes are reflected. The changes will then be applied to the database with the migrate command.

cd ~/drfauthproject

Then, let us create the migration files:

python manage.py makemigrations

The output on the terminal will look like the following:

students/migrations/0001_initial.py
- Create model Student

Then, apply the changes to the database:

python manage.py migrate

If the migration completes, the output will show as below:

Django oauth toolkit

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

Django oauth2 consumer

Библиотека Django OAuth2 Consumer от Rediker Software – это еще один пакет для OAuth 2.0.

Django rest framework oauth

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

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

Django-rest-auth

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

Django-rest-authemail¶

django-rest-authemail предоставляет RESTful API интерфейс для регистрации и аутентификации пользователей. Для аутентификации используются адреса электронной почты, а не имена пользователей. Доступны конечные точки API для регистрации, проверки электронной почты при регистрации, входа в систему, выхода из системы, сброса пароля, проверки сброса пароля, изменения электронной почты, проверки изменения электронной почты, изменения пароля и детализации пользователя. Полностью функциональный пример проекта и подробные инструкции прилагаются.

Django-rest-knox

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

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

Dj-rest-auth settings and configuration

Next, let us install dj-rest-auth to handle authentication. We shall also install the django-allauth package to enable us to use the standard registration process of dj-rest-auth which is powered by django-allauth.

Install the packages with the following command on the command-line

pip install dj-rest-auth django-allauth

Next, add django.contrib.sites, allauth, and dj-rest-auth, to the list of INSTALLED_APPS in our settings.py file.

We will also specifically add the registration module of the dj-rest-auth package, that is dj_rest_auth.registration to the list of INSTALLED_APPS to be able to use it in our project.

So, navigate to the root project folder and open the settings.py file.

cd ~/drfauthproject/drfauthproject/
nano settings.py

Then, add django.contrib.sites, allauth, dj-rest-auth and dj_rest_auth.registraion

...
INSTALLED_APPS = [
...
'django.contrib.sites',
'allauth',
'allauth.account',
'dj_rest_auth',
'dj_rest_auth.registration',
...

Next, perform migrations for the newly added django.contrib.sites :

python manage.py makemigrations
python manage.py migrate

Drfpasswordless

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

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

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

Making the api views

At this point, we want to add the API views for the Student application. Whenever an endpoint is visited, Django will fetch the corresponding view.

Open the views.py file in the students application directory and replace what is there with the following code:

from .models import Student
from rest_framework.generics import ListCreateAPIView, RetrieveUpdateDestroyAPIView
from rest_framework.permissions import IsAuthenticated
from .serializers import StudentSerializer

With the above code, we imported the following:

Outline

Prerequisites

Step 2 — setting up the django project and django rest framework

Firstly, let us install the tree package. tree is a good tool for viewing files and directory structures from the terminal. We can use it to view the directory structure of our project files.

sudo apt-get install tree

Step 3 — setting up student api

Next, we will use the Django REST Framework to create the REST API. We will create the models for database fields. We will also create API view functions for managing the API requests. We will then add API endpoints where the website visitors can access the API. We will also create serializers to transform model instances and QuerySets into JSON format when API responses are served.

When visitors make requests through the endpoints, Django calls the corresponding view to deal with the requests and provide responses to the requests respectively.

Our API endpoints will include the following:

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

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

— Jacob Kaplan-Moss, “REST worst practices”

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

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

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

Аутентификация – django-rest-framework-russian-documentation

Генерация токенов

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

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

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

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

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

obtain_auth_token будет возвращать JSON ответ когда получит валидное имя пользователя и пароль в POST запросе.

Имейте в виду, что по умолчанию obtain_auth_token явно использует JSON запросы и ответы, вместо использования по умолчанию визуализации и парсинга классов в ваших настройках. Если вам нужна своя версия obtain_auth_token, вы можете переопределить ObtainAuthToken класс и использовать его в ваших конфигурация url.

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

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

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

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

Класс sessionauthentication

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

Если успешно авторизовался, предоставляются следующие полномочия:

Класс tokenauthentication

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

Чтобы использовать TokenAuthentication схему, вам понадобится сконфигурировать аутентификационные классы чтобы включить TokenAuthentication, и дополнительно включить rest_framework.authtoken в ваших настройках INSTALLED_APPS:

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

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

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

Настройка схемы аутентификации¶

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

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

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

Пакеты сторонних производителей¶

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

django-rest-authemail

django-rest-authemail предоставляет RESTful API интерфейс для регистрации и аутентификации пользователей. Для аутентификации используются адреса электронной почты, а не имена пользователей. Доступны конечные точки API для регистрации, проверки электронной почты при регистрации, входа в систему, выхода из системы, сброса пароля, проверки сброса пароля, изменения электронной почты, проверки изменения электронной почты, изменения пароля и детализации пользователя. Полностью функциональный пример проекта и подробные инструкции прилагаются.

Справочник по api¶

TokenAuthentication

Эта схема аутентификации использует простую схему HTTP-аутентификации на основе токенов. Токен-аутентификация подходит для клиент-серверных установок, таких как собственные настольные и мобильные клиенты.

Для использования схемы TokenAuthentication вам нужно configure the authentication classes включить TokenAuthentication , и дополнительно включить rest_framework.authtoken в настройку INSTALLED_APPS:


Примечание: Обязательно запустите manage.pymigrate после изменения настроек. Приложение rest_framework.authtoken обеспечивает миграцию баз данных Django.


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

Для аутентификации клиентов ключ-токен должен быть включен в HTTP-заголовок Authorization. Ключ должен иметь префикс в виде строкового литерала «Token», с пробелами, разделяющими эти две строки. Например:

Примечание: Если вы хотите использовать другое ключевое слово в заголовке, например Bearer , просто подкласс TokenAuthentication и установите переменную класса keyword.

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

Ответы без аутентификации, которым отказано в разрешении, приведут к ответу HTTP401Unauthorized с соответствующим заголовком WWW-Authenticate. Например:

Инструмент командной строки curl может быть полезен для тестирования API с аутентификацией по маркеру. Например:


Примечание: Если вы используете TokenAuthentication в производстве, вы должны убедиться, что ваш API доступен только через https.


SessionAuthentication

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

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

Ответы без аутентификации, которым отказано в разрешении, приведут к ответу HTTP403Forbidden.

Если вы используете API в стиле AJAX с SessionAuthentication, вам нужно убедиться, что вы включили действительный CSRF-токен для любых «небезопасных» вызовов HTTP-метода, таких как PUT , PATCH , POST или DELETE запросы. Более подробную информацию смотрите в Django CSRF documentation.

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

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

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

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

Схема миграции

Приложение rest_framework.authtoken включает как Джанго миграцию, так и South миграцию которые создадут таблицу с токенами.

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

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

pip install django-oauth-toolkit

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

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

Step 1 — creating virtual environment and setting up dependencies

We shall start off by setting up a virtual environment and installing the dependencies for our application. A virtual environment will isolate the current project from other projects on our machine. So, we can have distinct versions of Python, pip, and other modules for the current project.

If you use a Windows machine, you can learn how to set up virtualenv on Windows in this article, Setting up a Virtual Environment for your Django Project . You can check How to set up virtual environments for Python on a Mac if you run macOS.

cd ~
virtualenv venv

Activate the created virtual environment using source:

source env/bin/activate

Make sure you are in your activated virtual environment while you are working on this project.

Next, you can install the dependencies using pip. These include the following:

Install the dependencies with the following command:

pip install django djangorestframework

With the project dependencies installed, you will create the Django project.

Add api endpoints

Now, we will create the API endpoints for the student application. We shall have two endpoints: api/students to create and get the list of students and api/students/<pk:id> to get, update and delete single students by their pk.

Create a urls.py file inside the students application directory and add the following imports inside:

from django.urls import path
from .views import StudentList, StudentDetail

Then, add the URL patterns for our endpoints in the urlpatterns list:

...
urlpatterns = [
path('', StudentList.as_view()),
path('<int:pk>', StudentDetail.as_view()),
]

int:pk above allows us to view the details of each student by going to an endpoint appended by the pk of the particular student.

The full code of the urls.py file of the student application is as follows:

from django.urls import path
from .views import StudentList, StudentDetail

urlpatterns = [
path('', StudentList.as_view()),
path('<int:pk>', StudentDetail.as_view()),
]

Next, let us connect the urls.py file of the student application to the urls.py file of the Django project.

Firstly, navigate to ~/drfauthproject/drfauthproject and open the urls.py file of the project:

cd ~/drfauthproject/drfauthproject
nano urls.py

Leave the code that is there already, but add the import to the students views and include as follows:

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

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