【问题标题】:Testing CORS Middleware with Gin使用 Gin 测试 CORS 中间件
【发布时间】:2020-08-23 06:35:12
【问题描述】:

我正在尝试编写一个测试来验证我的 API 的 CORS 设置是否正确。 API 用 Go 编写并使用 GIN。我有不同的 CORS 设置,具体取决于路由器组。它看起来像:

router := gin.New()
router.Use(gin.Recovery())

domainOneCORS := cors.New(cors.Config{
  AllowOrigins:  []string{"https://domainone.com"},
  AllowMethods:  []string{"GET", "POST", "PUT", "DELETE", "PATCH"},
  AllowHeaders:  []string{"Authorization", "Content-Length", "Content-Type", "Origin"},
  ExposeHeaders: []string{"Content-Length"},
  MaxAge:        12 * time.Hour,
})
domainTwoCORS := cors.New(cors.Config{
  AllowOrigins:  []string{"https://domaintwo.com"},
  AllowMethods:  []string{"GET", "POST", "PUT", "DELETE", "PATCH"},
  AllowHeaders:  []string{"Authorization", "Content-Length", "Content-Type", "Origin"},
  ExposeHeaders: []string{"Content-Length"},
  MaxAge:        12 * time.Hour,
})

domainOneAPI := router.Group("/one")
domainOneAPI.Use(domainOneCORS)
{
  domainOneAPI.GET("", handler.DomainOneHealth)
}

domainTwoAPI := router.Group("/two")
domainTwoAPI.Use(domainTwoCORS)
{
  domainTwoAPI.GET("", handler.DomainTwoHealth)
}

我正在尝试找出测试我的配置的最佳方法。我发现的大多数测试都使用处理程序并跳过路由器中间件部分。测试它有意义吗?即使我可以模拟出路由器和响应,也只是确认 HTTP 客户端可以访问端点。不验证不同域上的 Web 应用程序可以访问 API。 我发现this 问题类似,但用于回显。

【问题讨论】:

  • CORS 主要是客户端。您的服务器仅在响应中设置一些标头,并且客户端的工作是阻止或不阻止请求。因此,要测试您的配置,只需检查服务器响应中的标头即可。

标签: go configuration cors go-gin


【解决方案1】:

要测试 CORS 配置,您只需创建一个 http.Client 并检查标头即可。由于gin.Engine 实现了http.Handler,您可以利用httptest.Server 和类似的东西:

func TestCors(t *testing.T) {
    r := // create your GIN router with middleware config here
    origin := // The allowed origin that you want to check

    server := httptest.NewServer(r)
    defer server.Close()

    client := &http.Client{}
    req, _ := http.NewRequest(
        "GET",
        "http://"+server.Listener.Addr().String()+"/api",
        nil,
    )
    req.Header.Add("Origin", origin)

    get, err := client.Do(req)
    if err != nil {
        t.Fatal(err)
    }

    // You should get your origin (or a * depending on your config) if the
    // passed origin is allowed.
    o := get.Header.Get("Access-Control-Allow-Origin")
    if o != origin {
        t.Errorf("Got '%s' ; expecting origin '%s'", o, origin)
    }
}

保持类似的测试策略作为基础,您甚至可以编写一个表测试来检查多个来源和Access-Control-Allow-Origin 的预期值。

【讨论】:

    猜你喜欢
    • 2020-03-29
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2021-02-26
    • 2014-01-10
    • 1970-01-01
    相关资源
    最近更新 更多