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.