403 错误"Authentication credentials were not provided"在 Safari 中,但在 Chrome、Edge、Firefox 等中没有。 [Django



目前我在Safari和iOS设备上运行我的页面有问题。

主要问题是Safari在某些端点返回403错误,但令牌已经发送,这只发生在这个浏览器中。

例如:同时调用以下端点,第一个在Windows + Chrome中,另一个在Macbook + Safari 14中。两个请求的查询字符串、url和令牌是相同的。

get_quantites端点状态为200

get_quantites端点状态为200 -报头

get_quantites端点状态为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',
)
}

端点

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/')

相关内容

最新更新