Django 5 для начинающих

Прогресс по курсу:  9/1004

8.7 Права доступа и токены в DRF
4 из 4 шагов пройдено

TokenAuthentication

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

Эта схема аутентификации использует простую схему аутентификации HTTP на основе токенов.

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

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

INSTALLED_APPS = [
.....
...
    # API new
    'rest_framework',
    'blog_api.apps.BlogApiConfig',
    'django_filters',
    'rest_framework.authtoken',
]
REST_FRAMEWORK = {
    "DEFAULT_PERMISSION_CLASSES": [
        "rest_framework.permissions.IsAuthenticated",
    ],
    'DEFAULT_FILTER_BACKENDS': ['django_filters.rest_framework.DjangoFilterBackend'],

    'DEFAULT_PAGINATION_CLASS': 'rest_framework.pagination.LimitOffsetPagination',
    'PAGE_SIZE': 5,

    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework.authentication.SessionAuthentication',
        "rest_framework.authentication.TokenAuthentication",  # new

    ),

}

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

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

python manage.py drf_create_token admin

Эту часть информации, случайную строку 232f55782ec963c55d5159b74a9096abd0995ea5 мы будем использовать для аутентификации.

Давайте попробуем через командную строку Windows обратится к нашему API. Введем

curl -X GET http://127.0.0.1:8000/api/1/

И увидим следующий ответ, что учетные данные не были предоставлены.

Но теперь, когда у нас есть TokenAuthentication, давайте попробуем сделать еще один запрос к http://127.0.0.1:8000/api/1/ используя токен:

curl -X GET http://127.0.0.1:8000/api/1/ -H "Authorization: Token 232f55782ec963c55d5159b74a9096abd0995ea5"

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

Если вы хотите, чтобы у каждого пользователя был автоматически сгенерированный токен, вы можете просто перехватить сигнал post_save пользователя. Для этого откроем файл signals.py приложения accounts и изменим нашу функцию:

from rest_framework.authtoken.models import Token # new


@receiver(post_save, sender=User)
def create_profile(sender, instance, created, **kwargs):
    if created:
        Profile.objects.create(user=instance)
        Token.objects.create(user=instance) # new

Проверим работу, попробуем зарегистрировать нового пользователя:

После регистрации зайдем в админ панель, в раздел Tokens и мы видим:

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

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

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


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

Если у кого-то в windows после команды "curl -X GET http://127.0.0.1:8000/api/1/" в терминале ошибка вроде "Invoke-WebRequest : Не удается привязать параметр "Headers". Не удается преобразовать...", то попробуйте в команде заменить "curl" на "curl.exe"

Для мак такая же команда!

curl -X GET http://127.0.0.1:8000/api/1/


DRF + postman, было бы круто если было бы в этом курсе, хотя я купил и второй ваш курс для продолжающих возможно там это будет


для мак команда такая же но смотрите есть ли у вас пост 1 если его нет будет ошибка!

curl -X GET http://127.0.0.1:8000/api/1/ -H "Authorization: Token 232f55782ec963c55d5159b74a9096abd0995ea5"

Изменен No Name

@No_Name, для DRF в идеале планируем отдельный курс, в котором и поработаем с Postman. Во втором курсе DRF нет, там уже другие технологии.

curl -X GET http://127.0.0.1:8000/api/v1/23 -H "Authorization: Token my token"
Вводил команду в терминал и ничего не происходило, а все потому что не поставил / в конце url

Как сделать так. чтобы только пользователь с токеном мог просматривать и/или изменять данные api

@Попов_Станислав, Как один из вариантов добавить проверку на наличие токена у юзера в permissions.py:

class IsAuthorOrReadOnly(permissions.BasePermission):
    def has_permission(self, request, view):
        # Authenticated users only can see list view
        if request.user.is_authenticated and request.user.auth_token:
            return True
        return False

Сейчас в нашем проекте пользователи могут использовать две независимые системы авторизации: через сессии и токены. Однако, на уровне каждого отдельного класса представления мы можем конкретизировать способ аутентификации пользователя. Например, если в классе PostList прописать атрибут authentication_classes с классом TokenAuthentication, то данные записи можно получать только при авторизации по токенам:

class PostList(generics.ListCreateAPIView):
    permission_classes = (IsAuthorOrReadOnly,)
    queryset = Post.objects.all()
    serializer_class = PostSerializer
    authentication_classes = (TokenAuthentication,)  # new
.....
from rest_framework.authentication import TokenAuthentication