# Egg - 解决post请求报错 "invalid csrf token" {#egg-解决post请求报错-invalid-csrf-token}
# 方案一:关闭csrf {#方案一-关闭csrf}
服务端无法接受 post 请求,并且前台报错 403 ,服务端自动返回信息:message: 'invalid csrf token'。egg 框架内置了安全系统,默认开启防止 XSS 攻击 和 CSRF 攻击,可以通过关闭 CSRF 方式解决(不推荐),如下:
// config.default.js
config.security = {
csrf: {
enable: false,
},
}
# 方案二:客户端发送请求时,携带 csrfToken {#方案二-客户端发送请求时-携带-csrftoken}
# server端 {#server端}
// config.default.js
config.security = {
csrf: {
headerName: 'x-csrf-token', // 自定义请求头
},
}
# 客户端 {#客户端}
// 封装获取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')
注意
此方法使用cookie,但貌似最新的chrome浏览器已禁用在iframe中使用cookie,可尝试使用session解决,具体参考:egg-security配置 (opens new window)
# 方案三:设置referer {#方案三-设置referer}
// config.default.js
config.security = {
csrf: {
type: 'referer',
refererWhiteList: [ '请求接口的域名' ],
},
}
# security参考配置 {#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
},
}