Как я могу сделать параметр заголовка источника обязательным в Reitit?
У меня есть приложение Clojure с Pedestal & Reitit, и мне нужно, чтобы параметр заголовка origin был обязательным.
;; deps
[io.pedestal/pedestal.service "0.5.5"]
[pedestal/pedestal.jetty "0.5.5"]
[reitit-pedestal "0.5.5"]
[reitit "0.5.5"]
Но если я добавлю свою схему, запрос вызовет исключение.
(s/defschema my-request
{:header {:origin s/Str}})
["/my-route"
{:get {:parameters my-request
:handler my-handler}}]
Исключение:
: errors {:origin missing-required-key}
{
"message": "Bad Request",
"exception": "clojure.lang.ExceptionInfo: clojure.lang.ExceptionInfo in Interceptor :reitit.http.coercion/coerce-request -
Request coercion failed: #reitit.coercion.CoercionError{:schema {:origin java.lang.String, Keyword Any}, :errors {:origin missing-required-key}}
Запрос
curl -X GET "http://localhost:3000/my-route -H "accept: application/json" "origin: TEST" -H "user-agent: test"
Запрос CURL работает, проблема только в пользовательском интерфейсе Swagger с методом GET.
Кажется, что Swagger для методов get не отправляет параметр заголовка origin, чтобы избежать атак cors.
Могу ли я обойти это?
Спасибо за вашу помощь
1 ответ
После разговора с коллегой он показал мне, что:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Origin
Заголовок запроса Origin указывает, откуда происходит выборка. Он не включает никакой информации о пути, а только имя сервера. Он отправляется с запросами CORS, а также с запросами POST. Он похож на заголовок Referer, но, в отличие от этого заголовка, он не раскрывает весь путь.
И я нашел это
https://developer.mozilla.org/en-US/docs/Glossary/Forbidden_header_name
Имя запрещенного заголовка - это имя любого заголовка HTTP, который нельзя изменить программно; в частности, имя заголовка HTTP-запроса (в отличие от имени заголовка Forbidden ответа).
Угадайте, происхождение - одно из них.
Это тоже есть. https://bugzilla.mozilla.org/show_bug.cgi?id=1508661
Заголовок origin не должен устанавливаться для запросов GET и HEAD 2 года назад (2018-11-20)
Я попробовал и проверил свой запрос приложения в firefox и chrome, они ведут себя как ссылки.
Я полагаю, это все. благодаря