В уроке 9 по созданию API на Django REST Framework, мы рассмотрим аутентификацию по токену с помощью встроенного инструментария в пакет DRF. Такой тип аутентификации чаще всего используется для обращения к API.
В предыдущем уроке мы рассмотрели права доступа к API, вкратце разобрали, что такое аутентификация по сессии:
- Django REST Framework создание API: Урок 7, часть 1, права доступа пользователей
- Django REST Framework создание API: Урок 8, часть 2, аутентификация по сессиям, права доступа по группам, кастомные разрешения
Добавление аутентификации по токенам:
В settings.py в раздел INSTALLED_APPS нам необходимо добавить rest_framework.authtoken
.
engine/settings.py
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'rest_framework',
'rest_framework.authtoken',
'modules.blog.apps.BlogConfig',
]
После этого нам необходимо провести миграции: py manage.py migrate
Результат выполнения миграции:
(venv) PS C:\Users\Razilator\Desktop\Projects\App\backend> py manage.py migrate
Operations to perform:
Apply all migrations: admin, auth, authtoken, blog, contenttypes, sessions
Running migrations:
Applying authtoken.0001_initial... OK
Applying authtoken.0002_auto_20160226_1747... OK
Applying authtoken.0003_tokenproxy... OK
Добавим также обработку в главный файл urls.py для получения токена:
engine/urls.py
"""engine URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/4.1/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: path('', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.urls import include, path
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
"""
from django.contrib import admin
from django.urls import path, include
from rest_framework.authtoken.views import obtain_auth_token
urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('modules.blog.urls')),
path('api/auth/', obtain_auth_token)
]
Пояснение:
- Добавил
path('api/auth/', obtain_auth_token)
, предварительно импортировавobtain_auth_token
из rest_framework.authtoken.views
Отлично, все готово для использования токенов.
Рассматривать примеры использования токена будем на представлении ArticleRetrieveUpdateDestroyAPIView
:
modules/blog/views/articles.py
from modules.blog.models import Article
from modules.blog.serializers import ArticleSerializer
from rest_framework import generics, permissions, authentication
class ArticleRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
"""
Представление для получения, обновления, редактирования одной статьи (GET, PUT, DELETE)
"""
queryset = Article.objects.all()
serializer_class = ArticleSerializer
lookup_field = 'slug'
authentication_classes = [authentication.SessionAuthentication]
И изменим данное представление, добавив разрешения на основе Django модели permissions, и добавим TokenAuthentication
в authentication_classes
modules/blog/views/articles.py
from modules.blog.models import Article
from modules.blog.serializers import ArticleSerializer
from rest_framework import generics, permissions, authentication
class ArticleRetrieveUpdateDestroyAPIView(generics.RetrieveUpdateDestroyAPIView):
"""
Представление для получения, обновления, редактирования одной статьи (GET, PUT, DELETE)
"""
queryset = Article.objects.all()
serializer_class = ArticleSerializer
lookup_field = 'slug'
permission_classes = [permissions.DjangoModelPermissions]
authentication_classes = [authentication.SessionAuthentication, authentication.TokenAuthentication]
Пояснение:
- Добавили
authentication.TokenAuthentication
- для получения доступа к представлению с помощью токена. - Добавили
permissions.DjangoModelPermissions
- рассмотрим пример при использовании токена с встроенными Django разрешениями.
Теперь давайте обратимся по адресу POST запросом для получения первого токена http://127.0.0.1:8000/api/auth/, со следующими параметрами, передав логин и пароль пользователя:

Отправив POST запрос с данными для входа, я получаю токен следующего вида: 266ffb84967620ad16891b47426f83dec2798003, который могу использовать для доступа к API не только в браузере, но и в любых приложениях, в любых фреймворках и т.д.
Давайте получим токен к нашему тестовому пользователю:

Получил токен: e3b04bcb2fdfd4ac435fd988e807b2cdb84e635e
Нашему тестовому пользователю дам группу Admin, где я добавил все 4 разрешения на работу со статьями, а именно: просмотр, добавление, обновление, удаление. При этом я снял галочку, что этот пользователь имеет доступ к админ-панели.

Теперь давайте получим доступ к одному экземпляру статьи по адресу: http://127.0.0.1:8000/api/articles/test-article-4/
Без ввода токена мы получаем ошибку:

Нам необходимо добавить в заголовки наш токен и обратиться снова по этой же ссылке:

Как видите, я передал следующие заголовки: Authorization: Token e3b04bcb2fdfd4ac435fd988e807b2cdb84e635e
и таким образом получил доступ к API с внешней программы.
Примечание: если вы хотите использовать любое ключевое слово, вместо Token, например Bearer, то просто переопределите класс наследуясь от класса TokenAuthentication
Также для теста я могу отправить PUT запрос, так как в группе Admin мы разрешили использовать все запросы со статьями.

Если же я уберу право на обновление внутри группы Admin, мы получим ошибку:

На этом урок окончен, надеюсь у Вас все получилось.