Golang使用NoSurf时POST请求返回400 Bad Request问题排查
以下是几个最可能的原因及对应的排查/解决方法:
中间件未正确覆盖目标路由
NoSurf需要在GET请求时生成并设置CSRF令牌到Cookie,同时在POST请求时验证表单令牌与Cookie令牌的一致性。如果你的/search-availabilityGET路由没有经过NoSurf中间件,nosurf.Token(r)生成的令牌无法与NoSurf的Cookie令牌匹配,直接导致POST验证失败。
检查你的中间件注册逻辑,确保NoSurf中间件被全局应用(比如通过mux.Use(nosurf.NewPure)),或者至少覆盖该路由的GET和POST请求。示例:// 全局应用NoSurf中间件 mux.Use(nosurf.NewPure) // 注册路由 mux.Get("/search-availability", handlers.Repo.Availability) mux.Post("/search-availability", handlers.Repo.AvailabilityPost)模板中CSRF令牌未正确渲染
打开浏览器开发者工具,查看页面渲染后的HTML源码,确认<input type="text" name="csrf_token" value="{{.CsrfToken}}">的value属性是否包含有效的令牌字符串。如果是空值,说明AddDefaultData中的nosurf.Token(r)未正确获取令牌,本质还是中间件未处理该GET请求的问题。自定义字段名不匹配
如果你初始化NoSurf时自定义了CSRF表单字段名(比如通过SetFormFieldName方法),必须确保模板中输入框的name属性与配置一致。默认情况下NoSurf使用csrf_token作为字段名,若未自定义则可跳过此检查。Cookie限制导致令牌无法存储
检查浏览器是否禁用了Cookie,或者NoSurf的Cookie配置与站点环境不匹配:- 本地开发时不要设置
Secure属性(仅HTTPS生效); - 确认
SameSite属性设置符合浏览器要求(本地开发可设为SameSiteLaxMode)。
- 本地开发时不要设置
内容的提问来源于stack exchange,提问作者CaTx

