CORS支持& dockerized web服务器

时间:2018-04-05 17:39:30

标签: http docker cors

鉴于具有Swagger UI的API服务器,我想在docker容器中运行此服务器并从外部访问,并确保此服务器支持CORS。

请注意,如果存在任何Access-Control-Allow-Origin: <request.origin>请求标头,则当前服务器实现设置响应标头Origin,否则为Access-Control-Allow-Origin: *

因此,我将此服务器停靠,并且它在默认的docker接口0.0.0.0上运行。在localhost或任何其他部署环境中,api通过cURL,邮递员等都可以。不会有任何麻烦。

当我从浏览器访问此dockerized服务器以使用Swagger UI时,我看到错误表明OPTIONS请求未成功。与CLI工具不同,浏览器在实际请求之前发送OPTIONS请求。检查开发者控制台后,我看到我得到了No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin is therefore not allowed access.

我还看到OriginHost请求标头不同,我认为这会导致此错误。例如,由于泊坞广告,Originhttp://localhost:8080Host0.0.0.0:8080。 CORS参考文献relevant part也提到了这一点。我想现代浏览器会根据此参考实施CORS检查。

我可以通过为所有请求设置Access-Control-Allow-Origin: *响应标头来摆脱这种情况,但这只是一种解决方法而且不安全。

感谢任何指导和帮助。

1 个答案:

答案 0 :(得分:0)

好的,一些事情:

  1. Origin是向服务器表明它是CORS请求的内容 - 如果Origin请求标头未通过,则它不是跨源请求,因此您不需要发送任何 CORS响应标头。
  2. 发送Access-Control-Allow-Origin: <value-of-Origin-request-header>(你说你做了什么)绝对正确的事情。如果Origin请求标头是您信任的标头,则可以添加代码以仅发送ACAO标头,但此时可能会变得过于复杂。
  3. Host标头的值应该是无关紧要的 - 只要您在ACAO标头中发回Origin标头的值,它就应该有效。
  4. 如果您通过请求传递Cookie,您还需要返回Access-Control-Allow-Credentials: true,否则浏览器将不会处理任何Set-Cookie响应标头。
  5. 主要问题(我认为) - 支持OTPIONS请求:

    您是正确的,浏览器可能会发送CORS预检OPTIONS请求,而非浏览器则不会。如果是这样,您需要执行以下操作:

    • 确保您的服务器支持OPTIONS请求(默认情况下,许多Web服务器仅支持GET,POST和HEAD开箱即用)
    • 返回完全相同的ACAO标题以及对该OPTIONS请求的响应
    • 处理通过预检OPTIONS请求传递的其他CORS请求标头 - Access-Control-Request-MethodAccess-Control-Request-Headers

    最后一点可能会变得棘手,但最简单的方法是将以下响应头返回给OPTIONS请求:

    Access-Control-Allow-Origin: <value-of-Origin-request-header> Access-Control-Allow-Credentials: true Access-Control-Allow-Method: <value-of-Access-Control-Request-Method-request-header> Access-Control-Allow-Headers: <value-of-Access-Control-Request-Headers-request-header>

    并使用主GET / POST请求返回以下响应标头:

    Access-Control-Allow-Origin: <value-of-Origin-request-header> Access-Control-Allow-Credentials: true