You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GoFiber配置CSRF后token未达有效期快速过期返回403错误

问题原因
  • 最常见的原因是GoFiber CSRF中间件默认开启了SingleUse参数,每个CSRF Token仅允许使用一次,验证通过后立即失效,和你配置的8小时有效期无关,所以第一次请求后旧Token直接作废,第二次请求携带旧Token就会触发403错误,服务端会清空无效的CSRF Cookie。
  • 客户端手动设置的csrftoken变量没有随服务端返回的新Token更新,一直传递旧值导致验证失败。
  • 本地开发环境下CSRF Cookie默认开启了Secure属性,HTTP协议下浏览器不会存储该Cookie,导致后续请求没有携带有效Cookie。
  • 前后端分离跨域场景下没有开启axios的withCredentials配置,浏览器不会携带CSRF Cookie,服务端无法完成校验。
  • 服务端CORS配置不正确,未允许跨域请求携带凭证,或者允许的Origin设置为通配符*,导致Cookie传递失败。
解决方案

方案1:关闭单次Token限制(适合普通场景)

如果不需要每次请求刷新Token来获得更高安全性,可以直接关闭SingleUse配置,让Token在你设置的8小时有效期内可重复使用,同时根据环境配置CookieSecure属性:

app.Use(csrf.New(csrf.Config{
    KeyLookup:      "header:X-Csrf-Token",
    CookieName:     "csrf_bongo",
    CookieSameSite: "Strict",
    Expiration:     8 * time.Hour,
    SingleUse:      false, // 关闭单次使用限制
    CookieSecure:   false, // 本地HTTP开发环境设为false,生产HTTPS环境改为true
}))

方案2:保留单次Token限制(适合高安全要求场景)

如果需要保留SingleUse: true的安全策略,需要每次请求后从响应Cookie中读取最新的CSRF Token,更新本地存储的Token值。

客户端配置优化

你已经配置了axios的xsrf相关参数,不需要手动设置X-Csrf-Token请求头,axios会自动从Cookie中读取最新值填充,手动设置反而会覆盖最新值,同时需要全局开启凭证携带:

// 全局开启跨域凭证携带
$axios.defaults.withCredentials = true

$axios.onRequest((config) => {
    config.xsrfCookieName = "csrf_bongo"
    config.xsrfHeaderName = "X-Csrf-Token"
    // 删除手动设置X-Csrf-Token的代码,避免覆盖自动读取的最新值
})

额外检查项

  • 跨域场景下,服务端CORS配置需要设置Access-Control-Allow-Credentials: true,且Access-Control-Allow-Origin不能使用通配符*,必须显式指定前端的域名和端口。
  • 确认CSRF Cookie的CookiePath配置和你的接口路径匹配,默认值/可匹配所有路径,无需额外调整。

内容的提问来源于stack exchange,提问作者Saifullah Shahen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:36:03