Ruby on rails Cookies已设置,但未发送到Cloudfront
我正在尝试使用访问AWS Cloudfront上的私有内容Ruby on rails Cookies已设置,但未发送到Cloudfront,ruby-on-rails,cookies,amazon-web-services,amazon-cloudfront,Ruby On Rails,Cookies,Amazon Web Services,Amazon Cloudfront,我正在尝试使用访问AWS Cloudfront上的私有内容 在Puma服务器上运行的Rails 4.2.1应用程序- 使用最新的Chrome(并且可以在Firefox和Safari中复制) 我的应用程序成功设置了cloudfront所需的正确cookie,并且每个cookie都具有正确的值。作为参考,需要设置的三个cookie是: 云端策略 云端签名 CloudFront密钥对Id 我知道这些值是正确的,就像我抓取那些cookie并使用它们执行curl请求一样,它是成功的(为了简洁起见,
- 在Puma服务器上运行的Rails 4.2.1应用程序-
- 使用最新的Chrome(并且可以在Firefox和Safari中复制)
- 云端策略
- 云端签名
- CloudFront密钥对Id
<Error><Code>MissingKey</Code><Message>Missing Key-Pair-Id query parameter or cookie value</Message></Error>
你知道为什么我的饼干没有送到cloudfront吗?感谢您的建议和支持:)这很正常:每个cookie都有一个关联的域,对于每个请求,浏览器将只发送与请求的URL匹配的cookie 此外,您不能为任意域设置cookie-如果您的应用程序位于example.com上,则它可以为example.com和任何子域设置cookie,但不能为其他域(例如other domain.com)设置cookie 因此,如果您的应用程序被浏览器作为本地主机访问,则无法设置发送到foo.cloudfront.net的cookies。cloudfront中的签名Cookie功能非常新,因此我不确定这里推荐的方法是什么,但是您可以配置cloudfront将某些路径传递到您的应用程序(查看cloudfront的行为和起源文档)此时,浏览器认为它正在与cloudfront对话,因此它将允许您设置cookie,这些cookie将在后续请求中发送到您的cloudfront发行版 你的应用程序确实需要可以从cloudfront访问才能运行,所以我认为这在开发中不起作用
或者使用CNAME,以便您的cloudfront发行版和应用程序从同一个域提供服务。然而,这将意味着您不能使用默认的cloudfront ssl证书,除非SNI是可接受的,否则您需要额外付费才能使用自己的证书 解决方案是在Cloudfront上设置CNAME别名到content.mydomain.com,然后将我的开发环境设置到mydomain.com。当我将来开始生产时,这也需要设置 既然它们都共享相同的TLD,cookie就可以自由地传递到cloudfront,并且按照预期工作
感谢Frederick Cheung为我指出了正确的方向。是的,这就是我们的设置方式,使用CNAME别名并在基本域上设置cookie,然后您将能够传递cookie 让我们更详细地介绍一下,以防人们想知道下一步是什么,让我们使用上面的示例:-
$.ajax({
url: a_cross_domain_url,
xhrFields: {
withCredentials: true
}
});
如果请求成功,您应该从CloudFront获得一个带有“访问控制”的响应头
希望它能帮助人们寻找这个答案 aws文档非常混乱和糟糕。因为它并没有说如果您想要定制的策略,您需要传递CloundFront策略 首先,您需要让CNAME正常工作 第二,只需通过下面的cookie设置值,就可以了。您不需要在路径中指定最终的url,只需输入“/”
$.cookie('CloudFront-Signature', '', {
path: '/', domain: '.mydomain.com'
});
$.cookie('CloudFront-Key-Pair-Id', '', {
path: '/', domain: '.mydomain.com'
});
$.cookie('CloudFront-Policy', '', {
path: '/', domain: '.mydomain.com'
});
它对我有用 哦,当然了,我应该自己把这些都拼起来。非常感谢你。我想我可以在TLD下设置一个CNAME记录,然后通过它为我的发行版服务,然后使用一些技巧在同一TLD下为我的开发域服务。
$.cookie('CloudFront-Signature', '', {
path: '/', domain: '.mydomain.com'
});
$.cookie('CloudFront-Key-Pair-Id', '', {
path: '/', domain: '.mydomain.com'
});
$.cookie('CloudFront-Policy', '', {
path: '/', domain: '.mydomain.com'
});