egg csrf token 问题请教
有一个主项目 前端后端在一起。 react 服务端渲染,部署在根目录,egg 作为后端,开启了 csrf。
最近又写了一个 admin 项目,用的是 antd pro 那一套,纯前端项目,部署在 /admin/ 目录下。
admin 纯前端项目, 接口就写在了主项目里面。
域名是同一个 , 主项目地址是 abc.com/xxx ,admin 项目是 abc.com/admin/xxx , 由于 admin 主要是内部使用,访问过主项目 cookie 就种上了。但是 还是会报 csrf token 错误, 想请教一下这个是什么原因
4 回复
请教一下大佬 @atian25
csrf 的防范方式是 Double Cookie Defense
,原理就是:
- 访问时在服务端生成一个 csrf,这个 csrf 会被渲染到页面,并写入 cookies
- 前端 ajax 请求的时候,要带上这个 csrf(通过页面或 cookie 获取到),放在请求的 query 或 header 里面。
- 服务端收到 ajax 请求时,校验请求带上的 csrf 和 cookie 里面的 csrf 是否相同。
https://eggjs.org/zh-cn/core/security.html#ajax-请求
你是 2 个 egg 项目部署到同一个域名不同的 path 下? 猜测是因为 config.keys 不一样,这个会导致 cookie 的 sign 不一样,从而 a 服务注入的 cookie 在 b 服务那边解析失败,所以读不出 csrf 来。
admin 是纯前端?你的 ajax 请求没把 csrf 带上吧?需要手动操作,文档有写的,多看文档。
@atian25 多谢,想起来 之前是手动带上的,这次忘了