全栈杂货站
首页
  • 分类
  • 标签
  • 归档
  • 代码规范
  • Vue
  • JavaScript
  • 微信开发
  • 移动端H5调试工具
  • Nodejs
  • Egg
  • 环境搭建
  • Nginx
  • 常用工具
  • 实用技巧
  • 友情链接
关于

峻祥

开发小菜鸡
首页
  • 分类
  • 标签
  • 归档
  • 代码规范
  • Vue
  • JavaScript
  • 微信开发
  • 移动端H5调试工具
  • Nodejs
  • Egg
  • 环境搭建
  • Nginx
  • 常用工具
  • 实用技巧
  • 友情链接
关于
  • Nodejs

  • Egg

    • 实战

    • 解决方案

      • Egg解决post请求报错invalid csrf token
        • 方案一:关闭csrf
        • 方案二:客户端发送请求时,携带 csrfToken
        • 方案三:设置referer
        • security参考配置
      • Egg接口返回字段名下划线转驼峰
  • 后台
  • Egg
  • 解决方案
峻祥
2021-03-26

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

# 方案二:客户端发送请求时,携带 csrfToken

# server端

// config.default.js
config.security = {
  csrf: {
    headerName: 'x-csrf-token', // 自定义请求头
  },
}
1
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

注意

此方法使用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

# 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
上次更新: 2021-04-08 17:17:47
Egg使用egg-redis
Egg接口返回字段名下划线转驼峰

← Egg使用egg-redis Egg接口返回字段名下划线转驼峰→

最近更新
01
keepalive+Nginx双机热备
04-14
02
Nginx配置文件(五)-限流配置
04-14
03
Nginx配置文件(四)-负载均衡和集群部署
04-14
更多文章>
Theme by Vdoing | Copyright © 2021-2021 靳立祥 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式