Ошибка 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/')