Я создаю 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]
из моих представлений представления работают должным образом.