【问题标题】:Traefik 2 & Docker - CORS error on ElasticSearch apiTraefik 2 和 Docker - ElasticSearch api 上的 CORS 错误
【发布时间】:2021-08-04 08:14:31
【问题描述】:

我使用 Docker 和 Traefik 来管理调用 ElasticSearch API 的 ReactJS 应用程序。

这是我的 elasticsearch.yml 配置:

cluster.name: "docker-cluster"
network.host: 0.0.0.0
http.cors.enabled : true
http.cors.allow-origin: "*"
http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers: X-Requested-With,X-Auth-Token,Content-Type,Content-Length
http.cors.allow-credentials: true
xpack.security.enabled: true
xpack.security.authc.api_key.enabled: true

这里是我的 Elasticsearch 服务的 docker-compose 条目:

elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.12.0
    restart: always
    volumes:
      - ${DATA_FOLDER_ELASTICHSEARCH}:/usr/share/elasticsearch/data
      - ./infra/elasticsearch/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    environment:
      - discovery.type=single-node      
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.elasticsearch.rule=Host(`myElastic.domain.com`)"
      - "traefik.http.routers.elasticsearch.entrypoints=websecure"
      - "traefik.http.routers.elasticsearch.middlewares=testHeader"   
      - "traefik.http.middlewares.testHeader.headers.accesscontrolallowmethods=GET,OPTIONS,POST"
      - "traefik.http.middlewares.testHeader.headers.accesscontrolalloworiginlist=*"
      - "traefik.http.middlewares.testHeader.headers.accesscontrolmaxage=100"
      - "traefik.http.middlewares.testHeader.headers.addvaryheader=true"
    networks:
      - myNetwork

如果我调用我的 ElasticSearch API(例如使用 Postman 在/myIndex/_search 上的简单 POST,我有我的响应标头:

Access-Control-Allow-Origin : *
Vary : Origin

但是我在使用 fetch 的 React 应用程序上仍然存在 CORS 问题(现在我直接使用我的 react 中的 ElasticSearch API)。

我需要更改 fetch api 的任何内容吗?

编辑

查看CORS: Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true,似乎我无法使用* 来定义我的允许域,所以我放了:

- "traefik.http.middlewares.testHeader.headers.accesscontrolalloworiginlist=https://reactApp.domain.com"

但没有成功......在我的 Chrome 控制台中,我收到了这条消息:

preflight wildcard origin not allowed

【问题讨论】:

  • 假设您的 React 应用因为 http.cors.allow-credentials: true 而暴露于 http 凭据,您是否检查了应用 allow for cross site access control 发送的请求?
  • 不幸的是没有改变:(

标签: docker traefik


【解决方案1】:

@vincent-德科

晚了几个月,但如果你或任何人需要让这个工作,我可以通过包含这个标签来让 Traefik2 + 授权标头使用允许来源的“通配符”:

traefik.http.middlewares.cors-headers.headers.accessControlAllowOriginListRegex=(.*?)

见:https://doc.traefik.io/traefik/middlewares/headers/#accesscontrolalloworiginlistregex

它允许使用正则表达式来评估有效来源,而不是使用 accessControlAllowOrigin="hostname"。如果可以避免的话,这对于生产环境来说不是一个好主意,但对于我们的开发环境来说非常棒,开发人员可能会针对我们的开发/测试环境“公共”API 在本地修补我们的 UI。对于生产,我有一个正则表达式,它将允许的来源限制为一小组可接受的域/主机。

【讨论】:

  • 为什么这不利于生产?
  • @YacineLazaar 我应该有资格说“不是一个好主意......”。这取决于用例。在我的实现中,我们提供了一个微服务 API 后端,该后端仅供我们的客户端前端访问,并使用 cookie 进行身份验证。使用通配符 CORS 允许来源且 Allow-Credentials 为真,一方可以在中间利用人来窃取凭据等。 This article 有助于解释各种 CORS 漏洞。您的普通网站可以使用通配符来源。
猜你喜欢
  • 2019-08-19
  • 2020-10-28
  • 1970-01-01
  • 2017-09-07
  • 2018-11-16
  • 2016-06-10
  • 2018-11-28
  • 1970-01-01
  • 2016-01-02
相关资源
最近更新 更多