0

我有一个带有 Pedestal 和 Reitit 的 Clojure 应用程序,并且我需要 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 请求有效,问题仅在使用 GET 方法的 Swagger UI 中。

似乎 Swagger for get 方法不会发送原始标头参数以避免 cors 的攻击。

我可以解决这个问题吗?

谢谢你的帮助

4

1 回答 1

0

在我与一位同事讨论后,他向我展示了:

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

2 年前(2018-11-20)不应为 GET 和 HEAD 请求设置 origin 标头

我在 Firefox 和 chrome 中尝试并检查了我的应用程序请求,它们的行为与链接相同。

我想就是这样。谢谢

于 2020-10-09T20:55:53.527 回答