问题:
前台使用axios发送Post请求,后端使用egg框架接受请求,报错nodejs.ForbiddenError: invalid csrf token。
原因:
egg 框架内置了安全系统,默认开启防止 XSS 攻击 和 CSRF 攻击,每次请求得时候请求头必须携带csrfToken字段。
解决方案:
一:关闭安全策略
在 config.default.js 文件中加入以下代码:
config.security: {
csrf = {
enable: false,
}
}
但是显然这种是及其不提倡的。
二、请求头中携带csrfToken字段
server端:
// config.default.js
config.security= {
csrf : {
headerName: 'x-csrf-token',// 自定义请求头
}
}
客户端:
const getCookie = (val) => {//获取x-csrf-token字段
var arr,reg=new RegExp("(^| )"+val+"=([^;]*)(;|$)");
if(arr=document.cookie.match(reg))
return unescape(arr[2]);
else
return null;
}
// NProgress 配置
NProgress.configure({
showSpinner: false
});
//http请求拦截
httpNet.interceptors.request.use(function(config) {
console.log(document.cookie);
//发送请求之前
config.headers['Content-Type'] = "application/json";
config.headers['x-csrf-token'] = getCookie('csrfToken');//请求头设置x-csrf-token字段
//开启 progress bar
NProgress.start();
return config;
},function(err) {
//请求错误处理
return Promise.reject(err);
})