Django REST Framework создание API: Урок 9, аутентификация по токену
avatar
7 | (offline)
❤️‍🔥Notehunter Developer
Добавлено:
Категория: Руководства «Django»
Комментариев: 0

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

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

Добавление аутентификации по токенам:

В 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, мы получим ошибку:

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

Теги записи: Django, Django REST Framework, API, DRF,
Комментарии к статье 0
Комментариев нет
Форма добавления комментария (необходима регистрация)