【问题标题】:CORS issue using AWS Cloudfront with Signed Cookies. AllowedOrigin not getting set to what is passed in the Header [duplicate]使用带有签名 Cookie 的 AWS Cloudfront 的 CORS 问题。 AllowedOrigin 未设置为标头中传递的内容[重复]
【发布时间】:2020-01-13 07:27:20
【问题描述】:

说明这与其他问题有何不同(已标记为重复。

https://subdomain.domain.com 上的应用程序使用 PHP,它创建签名的 cookie 并发送到客户端。除了 cookie 我尝试设置标题(也尝试过不设置此标题)
header("Access-Control-Allow-Origin: https://subdomain.domain.com");

预期行为: Access-Control-Allow-Origin : https://subdomain.domain.com
实际行为: Access-Control-Allow-Origin : *

如果在 s3 中我将 CORS 设置为 <AllowedOrigin>https://subdomain.domain.com</AllowedOrigin> 事情很好。但我也将从 subdomain2 和 subdomain3 访问它。

那么如何根据上下文改变原点呢?

其余部分保持不变,为读者提供更多上下文:
++++++++

Access-Control-Allow-Origin 未设置为正确的来源“https://subdomain.domain.com

在 Safari(在 Mac 上)上一切正常,视频播放正常。
在 Chrome 和 Firefox 上,我收到以下错误

从源“https://subdomain.domain.com”访问“https://media.domain.com/folder/part1/part1.m3u8”处的 XMLHttpRequest 已被 CORS 策略阻止:响应中的“Access-Control-Allow-Origin”标头的值不得为通配符“* ' 当请求的凭据模式为 'include' 时。 XMLHttpRequest 发起的请求的凭证模式由 withCredentials 属性控制。

我已经设置了一个具有所需 CORS 配置的 s3 存储桶。 Cloudfront 分发版将 Origin、Access-Control-Allow-Origin 和 Access-Control-Allow-Methods 列入白名单。 “Forward Cookies”设置为全部。

为包含 .m3u8 和 .ts 文件的文件夹设置签名 cookie

  1. s3
<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/">
<CORSRule>
    <AllowedOrigin>*</AllowedOrigin>
    <AllowedMethod>GET</AllowedMethod>
    <AllowedMethod>HEAD</AllowedMethod>
    <MaxAgeSeconds>3000</MaxAgeSeconds>
    <AllowedHeader>*</AllowedHeader>
</CORSRule>
</CORSConfiguration>
  1. CF .

CNAME:media.domain.com
自定义通配符 SSL:*.domain.com

两个起源:
subdomain.domain.com
s3 存储桶

三种行为:

  1. 默认 - 指向 subdomain.domain.com
  2. *.m3u8 - 指向 s3 存储桶
  3. *.ts - 指向 s3 存储桶
  1. JWPlayer
withCredentials: 'true',
onXhrOpen: function(xhr, url) {                                            
    xhr.setRequestHeader("Access-Control-Allow-Headers","Content-Type, Accept, X-Requested-With");
    xhr.setRequestHeader("Access-Control-Allow-Origin","https://subdomain.domain.com");
    xhr.setRequestHeader("Access-Control-Allow-Credentials","true");
}

请求与响应

General:

Request URL: https://media.domain.com/folder/part1/part1.m3u8
Request Method: GET
Status Code: 200 
Remote Address: 54.230.71.77:443
Referrer Policy: no-referrer-when-downgrade

Response Headers:
accept-ranges: bytes
access-control-allow-methods: GET, HEAD
access-control-allow-origin: *
access-control-expose-headers: ETag
access-control-max-age: 3000
age: 9566
content-length: 686
content-type: application/x-mpegURL
date: Wed, 11 Sep 2019 09:32:35 GMT
etag: "626d2a3acf31a80ed709de0ddaf8e9a6"
last-modified: Fri, 06 Sep 2019 07:52:42 GMT
server: AmazonS3
status: 200
vary: Origin,Access-Control-Request-Headers,Access-Control-Request-Method
via: 1.1 5324246cfb52c8bfaf71104a45e6ce53.cloudfront.net (CloudFront)
x-amz-cf-id: LJ9F80PYJsSXkl-QO-nKFrRdqK8Hsy6Hc8dZ49t75bsx6u9RFmspzw==
x-amz-cf-pop: BLR50-C1
x-cache: Hit from cloudfront

Request Headers:
Provisional headers are shown
Origin: https://subdomain.domain.com
Referer: https://subdomain.domain.com/test/testcfurl
Sec-Fetch-Mode: cors
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36

在 Safari(在 Mac 上)上,请求的视频可以正常播放。
Chrome 和 Firefox 给出错误“当请求的凭据模式为 'include' 时,响应中的 'Access-Control-Allow-Origin' 标头的值不能是通配符 '*'”

感谢任何帮助。 已经尝试过hls.js CORS using AWS Cloudfront issues with Cookies中提到的所有内容

【问题讨论】:

    标签: amazon-s3 cors amazon-cloudfront jwplayer http-live-streaming


    【解决方案1】:

    我在使用 AWS S3 时遇到了同样的问题。如果 CloudFront 在响应中返回“Access-Control-Allow-Origin: *”参数,您是否尝试过 POSTMAN 工具?如果标头请求中不存在“Origin”参数,S3 不会将其发回,顺便说一句,您无法修改,因为它是由浏览器自动发送的。

    【讨论】:

    • CloudFront 确实返回“Access-Control-Allow-Origin: *”。这适用于 Safari,但不适用于 Chrome/Firefox。我认为这可能与 Cloudfront.net cookie 有关,但我已设置 CNAME 以限制到我的域。
    猜你喜欢
    • 2019-04-24
    • 2017-12-11
    • 2016-07-06
    • 2015-09-20
    • 1970-01-01
    • 2019-09-08
    • 2020-06-02
    • 2015-07-05
    • 2013-01-15
    相关资源
    最近更新 更多