如何在 Go 框架 gin 中设置中间件 gorillas/csrf

问题描述 投票:0回答:1

学习 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
go frameworks csrf
1个回答
0
投票

当您创建 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)
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.