51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

Egg解决post请求报错invalid csrf token

# 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
  },
}
赞(4)
未经允许不得转载:工具盒子 » Egg解决post请求报错invalid csrf token