package main
import (
"net/http"
"time"
"github.com/gogf/csrf"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/net/ghttp"
)
// set cfg
func main() {
s := g.Server()
s.Group("/api.v2", func(group *ghttp.RouterGroup) {
group.Middleware(csrf.NewWithCfg(csrf.Config{
Cookie: &http.Cookie{
Name: "_csrf",// token name in cookie
Secure: true,
SameSite: http.SameSiteNoneMode,// 自定义samesite
},
ExpireTime: time.Hour * 24,
TokenLength: 32,
TokenRequestKey: "X-Token",// use this key to read token in request param
}))
group.ALL("/csrf", func(r *ghttp.Request) {
r.Response.Writeln(r.Method + ": " + r.RequestURI)
})
})
s.SetPort(8199)
s.Run()
}
4 Comments
Glider
搭配CSRF上面的範例,我從URL 輸入位置進入form 頁面,第一次我的Token value 都是空的
<input type="hidden" name="X-Token" value=""/>
重新刷新之後 才會有cookie的資料
<input type="hidden" name="X-Token" value="1I7f3s6o4GwbFyOzSnVqdMfzQrfNX4hc"/>
不知是否有人碰到?
海亮
你的用法是错误的,r.Cookie.Get是从请求(request)中读取。而中间件是将csrf信息设置到返回(response)中的。至于为什么你第二次请求可以获取,是因为第二次请求把第一次请求返回的cookies带上了。
先这样解决,增加一个函数读取中间件设置的cookies,这个函数需要在经过了csrf中间件之后调用。
Glider
感謝,我試試看
郭强
海亮