Egg解决post请求报错invalid csrf token
# Egg - 解决post请求报错 "invalid csrf token"
# 方案一:关闭csrf
服务端无法接受 post 请求,并且前台报错 403 ,服务端自动返回信息:message: 'invalid csrf token'。egg 框架内置了安全系统,默认开启防止 XSS 攻击 和 CSRF 攻击,可以通过关闭 CSRF 方式解决(不推荐),如下:
// config.default.js
config.security = {
csrf: {
enable: false,
},
}
1
2
3
4
5
6
2
3
4
5
6
# 方案二:客户端发送请求时,携带 csrfToken
# server端
// config.default.js
config.security = {
csrf: {
headerName: 'x-csrf-token', // 自定义请求头
},
}
1
2
3
4
5
6
2
3
4
5
6
# 客户端
// 封装获取cookie方法
const getCookie = (name) =>{
let reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)')
let arr = document.cookie.match(reg)
if (arr) {
return unescape(arr[2])
} else {
return null
}
}
// 接口请求头添加csrfToken字段
headers['x-csrf-token'] = getCookie('csrfToken')
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
注意
此方法使用cookie,但貌似最新的chrome浏览器已禁用在iframe中使用cookie,可尝试使用session解决,具体参考:egg-security配置 (opens new window)
# 方案三:设置referer
// config.default.js
config.security = {
csrf: {
type: 'referer',
refererWhiteList: [ '请求接口的域名' ],
},
}
1
2
3
4
5
6
7
2
3
4
5
6
7
# security参考配置
exports.security = {
csrf: {
type: 'ctoken', // can be ctoken, referer, all or any, default to ctoken
useSession: false, // if useSession set to true, the secret will keep in session instead of cookie
ignoreJSON: false, // skip check JSON requests if ignoreJSON set to true
cookieName: 'csrfToken', // csrf token's cookie name
sessionName: 'csrfToken', // csrf token's session name
headerName: 'x-csrf-token', // request csrf token's name in header
bodyName: '_csrf', // request csrf token's name in body
queryName: '_csrf', // request csrf token's name in query
refererWhiteList: [], // referer white list
},
}
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
上次更新: 2021-05-10 17:15:54