Несанкционированный ответ на запрос POST в Django Rest Framework с токеном JWT - PullRequest
3 голосов
/ 18 октября 2019

Я создаю REST API с помощью Django Rest Framework. В настоящее время у меня есть проблема, когда некоторые из моих конечных точек возвращают HTTP 401 Unauthorized, тогда как подавляющее большинство моих конечных точек возвращают правильные ответы. Для аутентификации я использую токены JWT с djangorestframework-simplejwt.

Я настроил Django для использования аутентификации токена с djangorestframework-simplejwt.

# rest framework config settings
REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': [
        'rest_framework.permissions.IsAuthenticated',
        # 'rest_framework.permissions.AllowAny',
    ],
    'DEFAULT_AUTHENTICATION_CLASSES': [
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.TokenAuthentication',
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    ],

Подавляющее большинство моих конечных точек возвращают действительные данные, когда я передаю в запросе действительный токен доступа. Если я не отправляю действительный токен, я получаю HTTP 403.

С другой стороны, у меня есть несколько пользовательских представлений API, которые возвращают HTTP 401 независимо от того, передаю ли я действительный токен или нет.

Я включил код в один из моих проблемных представлений ниже.

class CheckDifferentialView(generics.GenericAPIView):
    permission_classes = [IsAuthenticated]
    authentication_classes = [TokenAuthentication]
    serializer_class = QuizDifferentialSerializer

    def post(self, request, *args, **kwargs):
        """
            A function to check a quiz question and to update a user's record of questions answered
        """
        print(request.META)
        if 'answer' not in request.data:
            return JsonResponse({'Error': 'answer not found in request'}, status=status.HTTP_400_BAD_REQUEST)

        answer = get_object_or_404(Differential, pk=request.data['answer'])
        serializer = QuizDifferentialSerializer(answer)

        if answer.is_correct:
            pass
            # record correct results
        else:
            pass
            # record failed result

        return Response(serializer.data, status=status.HTTP_200_OK)

А вот мой скрипт, который я использую для тестирования моего API

import requests
import json

POST_LOGIN_URL = 'http://localhost:8000/api/v1/token/'
POST_URL= 'http://localhost:8000/api/v1/check_differential'
REQUEST_URL = 'http://localhost:8000/api/v1/users'

with requests.Session() as session:
    post = session.post(POST_LOGIN_URL, json={"username": "j", "monkey": "aphextwin21"})
    token = json.loads(post.text)['access']
    headers = {'Authorization': 'Bearer ' + token}

    r = session.post(POST_URL, headers=headers, json={"answer": "2"})
    # r = session.get(REQUEST_URL, headers=headers)
    print(token)

print(r.text, r.status_code)

ЖелаемыйПоведение таково, что если я отправлю запрос POST с действительным токеном этой конечной точке, то это авторизует меня и продолжит свой день. Если заголовок авторизации с действительным токеном доступа не указан, то я ожидаю, что он отклонит запрос.


Обновление


Восторженный Мартин любезно указывает, что

authentication_classes = [TokenAuthentication]

Переопределял значения по умолчанию, найденные в моем файле настроек. Я не знал, что в отношении Django TokenAuthentication и JWTAuthentication трактуются по-разному. Теперь я знаю.

После удаления authentication_classess = [TokenAuthentication] из моих представлений представления работают должным образом.

1 Ответ

4 голосов
/ 18 октября 2019

Класс аутентификации представления явно установлен только на TokenAuthentication. Он не будет работать с токеном JWT.

 authentication_classes = [TokenAuthentication]

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

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