Django отвечает на запрос параметров, несмотря на отсутствие токена авторизации - PullRequest
0 голосов
/ 18 сентября 2018

Я тестирую ответы от остальных API.Если пользователь не отправляет токен, я ожидаю, что будет отправлен ответ 403.

В тесте (ниже) я создаю пользователя, создаю и получаю его токен аутентификации (для использования в других тестах) ипроверить, могу ли я отправить запрос параметров без аутентификации.

При тестировании конечной точки с помощью внешнего запроса я получаю ответ:

{
    "detail": "Authentication credentials were not provided."
}

Но мой код возвращает статус 200 сответ на запрос опций.

Я проверил, что нигде в коде i force_authentication(..., а self.client.credentials.__dict__) не возвращает пустой словарь.

Почему django возвращает запрос, когда permission_classes = (permissions.IsAuthenticated,)?

Просмотр:

from rest_framework import permissions
class getUserOptions(views.APIView, ReturnMetadata):
    permission_classes = (permissions.IsAuthenticated,)
    def options(self, request):
        field_meta = self.user_metadata(request)
        return Response(field_meta)

Тест:

from django.contrib.auth import get_user_model
from rest_framework import status
from rest_framework.test import APIClient
from rest_framework.authtoken.models import Token

class basic_functionality(APITestCase, TestCase):

    def setUp(self):
        self.user_details = {...}
        self.client = APIClient()
        self.user_model = get_user_model()

        user = self.user_model.objects.create(username=self.user_details['username'])
        user.set_password(self.user_details['password'])

        user.first_name = self.user_details['first_name']
        user.last_name = self.user_details['last_name']
        user.email = self.user_details['email']
        ...
        user.is_active = self.user_details['is_active']
        user.save()

        self.client.force_login(user)

        user_temp = self.user_model.objects.get(username=self.user_details['username'])
        self.user_token = Token.objects.get_or_create(user=user_temp)[0]

class user_options(basic_functionality):

    def request_user_options(self, payload):
        """
        Test getting options for the user form
        called by test_user_options
        payload: 
            - Authorization : token
        """
        url = reverse('user_options')
        headers = {'Content-Type': 'multipart/form-data'}
        response = self.client.options(url, data=payload, headers=headers)

        return response

    def test_user_options_bad_token(self):
        payload = {}
        response = self.request_user_options(payload)
        self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN)

1 Ответ

0 голосов
/ 18 сентября 2018

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

Я должен был установить self.client.force_authenticate(user=None)

Из документов :

Логин: Метод входа в систему работает точно так же, как и в обычном клиенте Django. учебный класс. Это позволяет вам аутентифицировать запросы по любым представлениям, которые включают SessionAuthentication.

# Make all requests in the context of a logged in session.
client = APIClient()
client.login(username='lauren', password='secret')

Unauthenticate:

Чтобы отменить аутентификацию последующих запросов, вызовите force_authenticate установка пользователя и / или токена на None.

client.force_authenticate(user=None)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...