Похоже, что DRF IsAuthenticated не работает должным образом на удаленном сервере

Я начал миграцию личного проекта между двумя серверами и получил очень странное поведение. Мой APP использует TokenAuthentication из DRF и прекрасно работает в локальной среде и на предыдущем сервере, но на новом сервере я получаю следующую ошибку: "Authentication credentials were not provided.". Сначала я подумал, что это из-за того, что Nginx не отправляет правильные заголовки на backend, но после отладки я обнаружил, что заголовки в порядке. Я полностью потерян в этой ситуации, надеюсь, что смогу получить помощь. Спасибо всем.

Моя конфигурация REST_FRAMEWORK:

REST_FRAMEWORK = {
    "DEFAULT_AUTHENTICATION_CLASSES": [
        "rest_framework.authentication.SessionAuthentication",
        "rest_framework.authentication.TokenAuthentication",
        #"rest_framework_simplejwt.authentication.JWTAuthentication",
    ],
    "DEFAULT_PAGINATION_CLASS": "rest_framework.pagination.LimitOffsetPagination",
    "PAGE_SIZE": 10,
    "DEFAULT_FILTER_BACKENDS": [
        "django_filters.rest_framework.DjangoFilterBackend"
    ],
}

Текущий вид:

class UserInfoView(APIView):

    permission_classes = [IsAuthenticated]

    def get(self, request):
        user = self.request.user
        return Response({"type": user.user_type, "username": user.username})

Запрос, сделанный CURL:

% curl 'http://myapp.com:8000/api/user-info/' \
  -H 'Connection: keep-alive' \
  -H 'sec-ch-ua: " Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"' \
  -H 'Accept: application/json, text/plain, */*' \
  -H 'Authorization: Token 144e22bc66c9b145596690c8673ef9aaefbaad1d' \
  -H 'sec-ch-ua-mobile: ?0' \
  -H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36' \
  -H 'sec-ch-ua-platform: "macOS"' \
  -H 'Sec-Fetch-Site: cross-site' \
  -H 'Sec-Fetch-Mode: cors' \
  -H 'Sec-Fetch-Dest: empty' \
  -H 'Referer: http://localhost:8100/' \
  -H 'Accept-Language: es-ES,es;q=0.9' \
  --compressed
{"detail":"Authentication credentials were not provided."}%                                               

Вид обновлен для отладки заголовков:

class UserInfoView(APIView):

    #permission_classes = [IsAuthenticated]

    def get(self, request):
        logger.info(request.headers)
        user = self.request.user
        return Response({"type": user.user_type, "username": user.username})

Отладка заголовков:

{'Content-Length': '', 'Content-Type': 'text/plain', 'Host': 'myapp.com:8000', 'Accept-Encoding': 'deflate, gzip', 'Connection': 'keep-alive', 'Sec-Ch-Ua': '" Not A;Brand";v="99", "Chromium";v="99", "Google Chrome";v="99"', 'Accept': 'application/json, text/plain, */*', 'Authorization': 'Token 144e22bc66c9b145596690c8673ef9aaefbaad1d', 'Sec-Ch-Ua-Mobile': '?0', 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.74 Safari/537.36', 'Sec-Ch-Ua-Platform': '"macOS"', 'Sec-Fetch-Site': 'cross-site', 'Sec-Fetch-Mode': 'cors', 'Sec-Fetch-Dest': 'empty', 'Referer': 'http://localhost:8100/', 'Accept-Language': 'es-ES,es;q=0.9'}

Наконец я нашел решение:

Изменение, внесенное в производственные настройки, заключалось в добавлении следующих строк:

+REST_FRAMEWORK = {
+    'DEFAULT_RENDERER_CLASSES': (
+        'rest_framework.renderers.JSONRenderer',
+    )
+}

Этот параметр переопределял ранее определенную конфигурацию REST_FRAMEWORK.

Вернуться на верх