Тестовый модуль 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',)
}