Я новичок в DRF (Django Rest Framework). Я пытаюсь использовать аутентификацию с помощью токена в своих вызовах API.
Я сделал это:
1- При создании нового пользователя:
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.conf import settings
# This code is triggered whenever a new user has been created and saved to the database
@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
2- Создать:
./manage.py createsuperuser --email [email protected] --username fabrice
Две таблицы (authtoken_token и auth_user) в порядке.
Но когда я вызываю API, если не добавляйте токен, api работает :(:
$ http -a fabrice:azerty12 http://127.0.0.1:8000/firerisk/highway/
HTTP/1.1 200 OK
Allow: GET
Content-Length: 179
Content-Type: application/json
Date: Thu, 31 May 2018 12:49:10 GMT
Server: WSGIServer/0.2 CPython/3.5.2
Vary: Accept
X-Frame-Options: SAMEORIGIN
[
{
"id": 1,
"name": "XXX"
},
{
...
...
Но, только этот звонок должен работать, нет ?? :
http -a fabrice:azerty12 http://127.0.0.1:8000/firerisk/highway/ 'Authorization: Token a840a16a3cd43e346f7a3e1442fce0acdf51d609'
И, если я не использую аутентификацию, это неудача и Ничего страшного:
$ http http://127.0.0.1:8000/firerisk/highway/
HTTP/1.1 401 Unauthorized
Allow: GET
Content-Length: 58
Content-Type: application/json
Date: Thu, 31 May 2018 12:25:44 GMT
Server: WSGIServer/0.2 CPython/3.5.2
Vary: Accept, Cookie
WWW-Authenticate: Basic realm = "api"
X-Frame-Options: SAMEORIGIN
{
"detail": "Informations d'authentification non fournies."
}
мой settings.py:
# the REST Framework
'rest_framework',
'rest_framework.authtoken',
'django_extensions',
]
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES': (
'rest_framework.permissions.IsAuthenticated',
),
'DEFAULT_AUTHENTICATION_CLASSES': (
'rest_framework.authentication.BasicAuthentication',
'rest_framework.authentication.SessionAuthentication',
'rest_framework.authentication.TokenAuthentication',
)
}
и ViewSet (ModelViewSet):
class HighwayViewSet(viewsets.ModelViewSet):
"""
API endpoint that allows highway to be viewed
"""
serializer_class = HighwaySerializer
# Authentification !
permission_classes = (IsAuthenticated,)
queryset = Highway.objects.all().order_by('name')
# Only 'get' method
http_method_names = ['get']
Я не прав ?
Спасибо за помощь.
Ф.





Сначала вам нужно изучить основы. Что такое HTTP, что такое HTTP-заголовки, что такое сеанс Django (это не HTTP-заголовок, и содержимое сеанса не влияет на заголовки), прочтите документацию Django REST Framework по аутентификации токена.
Если вы хотите протестировать свои представления в браузерах, то явно разрешите аутентификацию сеанса Django в переменной конфигурации DRF DEFAULT_AUTHENTICATION_CLASSES. Он может сосуществовать с аутентификацией по токену.
Вы не можете заставить простой веб-браузер добавлять токен к HTTP-запросу, если вы не используете какой-либо плагин, например RESTClient, DHC или REST Easy.
Вы добавляете токен в сеанс Django, но вы отключили аутентификацию сеанса в DRF, и даже если вы включите его, DRF не читает токен из сеанса Django, потому что у клиента API нет возможности добавить токен в сеанс Django. Даже если DRF будет читать токен из сеансов Django, это было бы совершенно бессмысленно, поскольку клиент не может контролировать содержимое th
Привет. Спасибо, но все это я знаю :). Но не вся концепция DRF. Я не упоминал settings.py. Я добавил правильный код в переменные INSTALLED_APPS и REST_FRAMEWORK. Мой комментарий выше работает.
Кажется, что если я вызываю api вот так, он работает (не говоря уже об имени пользователя и пароле): http 127.0.0.1:8000/firerisk/highway 'Авторизация: токен a840a16a3cd43e346f7a3e1442fce0acdf51d609'.