Тестирование ПО промежуточного слоя CORS с помощью Gin

Я пытаюсь написать тест, который проверяет правильность настройки CORS для моего API. 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-клиент может попасть в конечную точку. Отсутствие проверки веб-приложения в другом домене может привести к срабатыванию API. Я обнаружил эту проблему, похожую на эхо.


person Keith    schedule 07.05.2020    source источник
comment
CORS в основном работает на стороне клиента. Ваш сервер устанавливает только некоторые заголовки в ответе, а его задача - блокировать запрос или нет. Итак, чтобы проверить свою конфигурацию, просто проверьте заголовки, присутствующие в ответах вашего сервера.   -  person SystemGlitch    schedule 08.05.2020


Ответы (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.

person Jay    schedule 08.05.2020