【问题标题】:Preflight (OPTIONS) returns 403, CORS预检 (OPTIONS) 返回 403,CORS
【发布时间】:2020-08-11 10:11:26
【问题描述】:

我们正在使用 Kubernetes 和 Istio 并配置了一个虚拟服务:

  http:
  - match:
    - uri:
        prefix: /api
    rewrite:
      uri: /api
    route:
    - destination:
        host: svc-api
        port:
          number: 80
        subset: stable
      weight: 0
    - destination:
        host: svc-api
        port:
          number: 80
        subset: vnext
      weight: 100
    corsPolicy: &apiCorsPolicy
      allowOrigins:
      - exact: '*'
      allowMethods:
      - GET
      - POST
      - OPTIONS
      allowCredentials: true
      allowHeaders:
      - "*"
  - match:
    - uri:
        prefix: /
    rewrite:
      uri: /
    route:
    - destination:
        host: svc-api
        port:
          number: 80
        subset: stable
      weight: 0
    - destination:
        host: svc-api
        port:
          number: 80
        subset: vnext
      weight: 100
    corsPolicy: *apiCorsPolicy

从浏览器向https://[host]/api/* 发出请求在使用'from origin [request] has been blocked by CORS policy' 的OPTIONS 请求上失败。

在 k8 中描述服务显示了正确的配置。

根据 v 1.6.4,使用 allowOriginsexact 而不是 allowOrigin 的结构是正确的。

我在这里错过了什么?

【问题讨论】:

  • 您的集群中是否有某种类型的授权,例如 jwt?能否尝试将exact: '*' 更改为exact : 'example.com' 并检查问题是否仍然存在?另外看看这个github issue,也许你应该添加AllowHeaders而不是使用'*'
  • @jt97 - 感谢您的评论。我确实尝试使用像example.com 这样的特定主机,并且我还尝试添加所需的标头而不是使用通配符,但效果相同。我们确实有一个 jwt 授权,如果请求来自服务器但任何浏览器(创建 OPTIONS 请求)失败,则可以完美处理。
  • @jt97 您发布的链接仅提及使用allowOriginsexact 而不仅仅是allowOrigin - 不幸的是,我尝试了两种设置,结果相同。
  • 好像cors配置没问题,我问了授权因为403是授权码,当jwt策略针对Istio Ingress网关时cors不起作用,有一个github issue关于那,你能添加你的请求和授权策略吗?
  • 另外看看这个stackoverflow question,社区成员在这里有一个工作选项,但是返回403。

标签: kubernetes cors http-status-code-403 istio


【解决方案1】:

这里有几件事值得一提。


最近在较旧的 istio 版本中,cors 和 jwt 结合在一起出现了问题,请查看以下链接:


还有另外一个github issue,在这个comment 社区成员有同样的问题,也许值得为此打开一个新的github问题?


另外还有来自 istio dev @howardjohn 的回答

大家好。使用 curl 测试 CORS 可能有点误导。在服务器端不强制执行 CORS;例如,它不会返回 4xx 错误。相反,返回的标头被浏览器用来拒绝/接受。 https://www.envoyproxy.io/docs/envoy/latest/start/sandboxes/cors.html?highlight=cors 提供了一个很好的演示,https://www.sohamkamani.com/blog/2016/12/21/web-security-cors/#:~:text=CORS%20isn't%20actually%20enforced,header%20in%20all%20its%20responses。是一个很好的解释。

因此,Istio 的工作只是返回这些标头。我已经添加了一个测试表明这个工作:#26231


正如我在评论中提到的,值得看看另一个社区成员配置 here,因为他有一个工作选项示例,但 POST 出现 403 问题。


我会在你的虚拟服务中改变一些事情

只使用corsPolicy 而不是corsPolicy: &apiCorsPolicy

corsPolicy:

您也可以使用正则表达式来代替精确的通配符。

allowOrigins:
- regex: '*'

关于//api路径,我觉得这里前缀就够了,不需要重写。


【讨论】:

  • 对通配符使用正则表达式对我有用。谢谢
猜你喜欢
  • 2020-04-09
  • 2013-08-06
  • 2015-08-04
  • 2016-11-23
  • 2013-10-24
  • 2018-03-15
  • 2017-09-30
  • 2016-04-28
  • 2019-08-29
相关资源
最近更新 更多