Похоже, что 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.