Ошибка 403 "Учетные данные для аутентификации не были предоставлены" в Safari, но не в Chrome, Edge, Firefox и т. д. [Django + Next.js]

В настоящее время у меня проблемы с запуском моей страницы в Safari и на устройствах iOS.

Основная проблема в том, что Safari возвращает 403 ошибку в некоторых конечных точках, но токен был отправлен, и это происходит только в этом браузере.

Например: Следующая конечная точка была вызвана в одно и то же время, первый раз в Windows + Chrome, а второй в Macbook + Safari 14. Строки запроса, url и токен одинаковы для обоих запросов.

get_quantites enpoint with status 200

get_quantites enpoint with status 200 - headers

get_quantites enpoint with status 403

Я использую токен аутентификации django-rest-framework Настройка реализована здесь

Здесь немного полезного кода:

settings.py

REST_FRAMEWORK = {
    'DEFAULT_SCHEMA_CLASS': 
    'rest_framework.schemas.coreapi.AutoSchema',
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'users.authentication.SafeJWTAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    )
}

Endpoint

class JkmdWastagecategoriesViewSet(ModelViewSet):
queryset = JkmdWastagecategories.objects.order_by('pk')
serializer_class = JkmdWastagecategoriesSerializer

@action(detail=False)
def get_categories(self, request):
    """
    Recieve a machine name as machine_name and return
    the wastages categories
    """
    data = []
    machine_name = request.GET.get('machine_name')
  
    machine = JkmdMachine.objects.filter(name=machine_name).first()

    if machine:
        categories_pl = JkmdWastagecategories.objects.filter(
            production_line=machine.machine_group.operation.process.production_line,
        )
        serializer_pl = JkmdWastagecategoriesSerializer(
            categories_pl, many=True)
        if serializer_pl:
            data += serializer_pl.data

        categories_one = JkmdWastagecategories.objects.filter(
            operation=machine.machine_group.operation,
        )
        serializer_one = JkmdWastagecategoriesSerializer(
            categories_one, many=True)
        if serializer_one:
            data += serializer_one.data

        categories_two = JkmdWastagecategories.objects.filter(
            machine_group=machine.machine_group,
        )
        serializer_two = JkmdWastagecategoriesSerializer(
            categories_two, many=True)
        if serializer_two:
            data += serializer_two.data

        categories_three = JkmdWastagecategories.objects.filter(
            machine=machine,
        )

        serializer_three = JkmdWastagecategoriesSerializer(
            categories_three, many=True)
        if serializer_three:
            data += serializer_three.data

    return Response(data, status=status.HTTP_200_OK)

пользовательский объект axios

const service = axios.create();

service.interceptors.request.use(
  function (config) {
    let cancel;
    // Set the cancelToken object
    config.cancelToken = new axios.CancelToken(function (c) {
      cancel = c;
    });
    // Prevent repeated requests. When the previous request is not completed, the same request will not proceed
    stopRepeatRequest(
      reqList,
      config.url,
      cancel,
      `${config.url}  Request interrupted`
    );
    const token = window.localStorage.getItem("access_token");
    if (token) {
      config.headers["Authorization"] = `Token ${token}`;
    }
    config.headers["Content-Type"] = "application/json";
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

В настоящее время запросы и ответы управляются с помощью redux.

Проведя некоторое время в поисках ответов, я наконец получил его.

Это сообщение натолкнуло меня на мысль, что, возможно, некоторые конечные точки неправильно работают со стандартами маршрутов DRF, и я оказался прав:

Некоторые конечные точки не имеют "/" перед строками запроса

- axios.get(`.../get_quantities?machine_name=${machine_name}`)
+ axios.get(`.../get_quantities/?machine_name=${machine_name}`)

У некоторых конечных точек отсутствует "/" в конце

- axios.get('.../get_pb_list')
+ axios.get('.../get_pb_list/')
Вернуться на верх