【问题标题】:How can I set the origin header param as mandatory in Reitit?如何在 Reitit 中将原始标头参数设置为强制?
【发布时间】:2020-10-10 04:55:53
【问题描述】:

我有一个带有 Pedestal 和 Reitit 的 Clojure 应用程序,我需要将原始标头参数设为强制性。

;; 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 方法没有发送 origin 标头参数以避免 cors 的攻击。

我可以解决这个问题吗?

感谢您的帮助

【问题讨论】:

  • “请求中断”是什么意思?请将 errors/stacktraces/... 添加到问题中
  • 我改写了“但是如果我放入我的架构,请求会引发异常”,更好吗?
  • 我注意到 CURL 请求有效,问题仅在 swagger ui 中。

标签: clojure reitit


【解决方案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

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

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

我想就是这样。谢谢

【讨论】:

  • 有人考虑吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 1970-01-01
  • 2022-06-16
  • 2016-09-09
  • 1970-01-01
相关资源
最近更新 更多