学习 gin,go 框架,我需要插入一个 csrf 令牌,搜索我找到了用于 make csrf 和其他东西的 gorillas utils,但我的问题是下一个。 这个
csrfMiddleware := csrf.Protect([]byte("32-byte-long-auth-key"))
制作这种类型
func Protect(authKey []byte, opts ...Option) func(http.Handler) http.Handler
并尝试在杜松子酒中使用这个中间件功能,特别是:
g := gin.Default()
g.Use(csrfMiddleware) ///set a middleware
如何将 middlware csrf Protect 与 gin 一起使用??,在文档中声称兼容。 我很困惑。
这段代码可以工作,但我不知道它是否正确,在文档中说如果中间件正常工作,csrf.Token应该生成一个令牌,否则,什么也不生成
type helloWorldHandler struct{}
func (h helloWorldHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
fmt.Println("entro")
}
func main() {
r := gin.Default()
csrfMiddleware := csrf.Protect([]byte("32-byte-long-auth-key"))
var d helloWorldHandler
r.Use(gin.WrapH(csrfMiddleware(d)))
r.GET("/test/session/:id", func(c *gin.Context) {
a := csrf.Token(c.Request)
fmt.Println(a)
c.Header("X-CSRF-Token", csrf.Token(c.Request))
})
// Listen and serve on 0.0.0.0:8080
当您创建 gin 中间件时,只需调用 csrf.Protect 函数并将匿名函数设置为您调用 ctx.Next() 的参数
//create gin middleware as usual
func CSRFMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
// create gorilla/csrf middleware as showed in docs
gorillaCSRF := csrf.Protect(
[]byte("32-byte-long-auth-key"),
// set properties as needed with csrf.<setter function>
csrf.ErrorHandler(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {
//use context from gin-gonic instead of http writer/request
c.JSON(http.StatusForbidden, gin.H{"error": "CSRF token mismatch"})
c.Abort()
})),
)
gorillaCSRF(http.HandlerFunc(func(_ http.ResponseWriter, _ *http.Request) {
// Call next handler
c.Next()
})).ServeHTTP(c.Writer, c.Request)
}
}