Аутентификация токена с DRF не активна - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в 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 f.user@blahblah.com --username fabrice

2 таблицы ( 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']

Я не прав?

Спасибо за помощь.

F.

1 Ответ

0 голосов
/ 31 мая 2018

Вы должны изучить основы в первую очередь.Что такое HTTP, что такое заголовки HTTP, что такое сеанс Django (это не заголовок HTTP и содержимое сеанса не влияет на заголовки), прочитайте документацию Django REST Framework по аутентификации токена.

Если вы хотитечтобы проверить свои представления в браузерах, затем явно разрешите аутентификацию сеанса Django в переменной конфигурации DRF DEFAULT_AUTHENTICATION_CLASSES.Он может сосуществовать с аутентификацией токена.

Невозможно заставить простой веб-браузер добавлять токен в запрос HTTP, если вы не используете какой-либо плагин, например RESTClient, или DHC или REST Easy.

Youвы добавляете токен в сеанс Django, но вы отключили аутентификацию сеанса в DRF, и даже если вы включите его, DRF не будет считывать токен из сеанса Django, поскольку клиент API не может добавить токен в сеанс Django.Даже если бы DRF считывал токен из сессий Django, это было бы совершенно бессмысленно, так как клиент не контролировал содержимое th

...