Тестовый модуль JWT Django-Rest-Framework говорит: "Аутентификация не предусмотрена"

Когда я пытаюсь выполнить тестовый модуль, я получаю сообщение об ошибке:

"detail": "Учетные данные аутентификации не предоставлены."

Однако я использую django-rest-framework-jwt, который хочет, чтобы веб-токен был помещен в заголовок как "Авторизация: JWT ". Я сделал wireshark на работающем, принятом пакете с моего сайта, и он имел заголовок Authorization: JWT. Как и мой текущий запрос, который отклонен. Я не могу понять, почему это не удается.

Добавление force_authenticate позволяет запустить его, но я хотел бы проверить свои разрешения.

Вот ссылка из Документации:

Теперь для доступа к защищенным URL-адресам Api необходимо включить заголовок Authorization: JWT.

документация django-rest-framework-jwt

Вот запрос от PyCharm:

{'REQUEST_METHOD': 'PATCH', 
'CONTENT_TYPE': 'application/json; charset=None', 
'CONTENT_LENGTH': 74, 
'PATH_INFO': '/api/v1/members/5', 
'QUERY_STRING': '', 
'Authorization': 'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6InVzZXIiLCJlbWFpbCI6ImVtYWlsQGdtYWlsLmNvbSIsInVzZXJfaWQiOjUsImV4cCI6MTQzNzUzOTE4MH0.cGcXw9srOYgbeICdbMw8Ey_ya9eBRD-ptRsGwd2jzlk', 
'wsgi.input': <django.test.client.FakePayload object at 0x106689748>
}

Вот код:

class ModifyTest(APITestCase):
    """ Test modifying users, to include member_profile
    """
    username = 'user'
    password = 'passwd'
    token = 0
    user_id = 0

    def setUp(self):
        data = {'username': self.username,
                'password': self.password,
                'email': 'email@gmail.com'}
        url = reverse('members:auth-user-create')
        response = self.client.post(url, data, format='json')
        self.user_id = response.data['id']

        data = {'username': self.username,
                'password': self.password}
        url = reverse('token_auth')
        response = self.client.post(url, data, format='json')
        self.token = response.data['token']

    def test_auth_user_info(self):
        data = {'id': str(self.user_id),
                'password': self.password,
                'email': 'email@gmail.com',
                'username': self.username,
                }
        url = reverse('members:auth-user-detail', kwargs={'pk': self.user_id})
        response = self.client.patch(url, data, Authorization='JWT ' + self.token, format='son')
        self.assertEqual(response.status_code, 200)

Обновление: при прохождении аутентификации я понял, что мой взгляд не использует правильные классы аутентификации. Ниже приведены мои настройки, хотя...

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        #'rest_framework.authentication.BasicAuthentication',
        #'rest_framework.authentication.SessionAuthentication',
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
}
REST_FRAMEWORK = {
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
}

И мой взгляд:

class AuthUserDetail(generics.RetrieveUpdateDestroyAPIView):
    permission_classes = (IsOwnerOrAdmin,)
    queryset = get_user_model().objects.all()
    serializer_class = AuthUserModelSerializer

Однако мои классы разрешений в моем отладчике при вызове представления:

<class 'rest_framework.authentication.SessionAuthentication'>, 
<class 'rest_framework.authentication.BasicAuthentication'>

Поэтому добавление этой строки в мое представление исправляет это:

authentication_classes = (JSONWebTokenAuthentication,)

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

1 ответ

Я понял это... Я не узнал, что у меня было два раздела REST_FRAMEWORK, поэтому очевидно, что второй перезаписывал первый, стирая мои значения по умолчанию... новый файл настроек:

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_jwt.authentication.JSONWebTokenAuthentication',
    ),
    'DEFAULT_FILTER_BACKENDS': ('rest_framework.filters.DjangoFilterBackend',)
}
Другие вопросы по тегам