Изучив работу кода BX.ajax.runAction, я обнаружил, что при неверном CSRF используется error.customData.csrf:
var csrfProblem = false;
response.errors.forEach(function(error) {
if (error.code === 'invalid_csrf' && error.customData.csrf){
BX.message({'bitrix_sessid': error.customData.csrf});
originalConfig.headers = originalConfig.headers || [];
originalConfig.headers = originalConfig.headers.filter(function(header) {
return header && header.name !== 'X-Bitrix-Csrf-Token';
});
originalConfig.headers.push({name: 'X-Bitrix-Csrf-Token', value: BX.bitrix_sessid()});
csrfProblem = true;
}
});
if (csrfProblem){
return buildAjaxPromiseToRestoreCsrf(originalConfig, true);
}
Решил повторить:
fetch(name,sessid,data,result,error){
const formData = new FormData();
for (const [key,value] of Object.entries(data)){
formData.append(key,value as any);
}
fetch(utils.arrayToUrlParams('/bitrix/services/main/ajax.php',{
action: 'test.api.test.'+name,
}),{
method: 'POST',
body: formData,
headers: {
'X-Requested-With': 'XMLHttpRequest',
'X-Bitrix-Csrf-Token': sessid
}
}).then((response:any)=>response.json()).then((response)=>{
let csrf = false;
if(response.status == 'error' && Array.isArray(response.errors)){
response.errors.forEach((error:any) => {
if (error.code === 'invalid_csrf' && error.customData.csrf){
csrf = error.customData.csrf;
}
});
}
if(csrf){
this.fetch(name,data,result,error,csrf);
}else{
result(response);
}
}).catch(error);
}
При использовании error.customData.csrf не пострадает ли безопасность?