Ruby on rails Cookies已设置,但未发送到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请求一样,它是成功的(为了简洁起见,

我正在尝试使用访问AWS Cloudfront上的私有内容

  • 在Puma服务器上运行的Rails 4.2.1应用程序-
  • 使用最新的Chrome(并且可以在Firefox和Safari中复制)
我的应用程序成功设置了cloudfront所需的正确cookie,并且每个cookie都具有正确的值。作为参考,需要设置的三个cookie是:

  • 云端策略
  • 云端签名
  • CloudFront密钥对Id
我知道这些值是正确的,就像我抓取那些cookie并使用它们执行curl请求一样,它是成功的(为了简洁起见,值替换为…):

过错 当我使用浏览器时,虽然我可以看到Cookie已在我对服务器的原始请求中设置,但我对Cloudfront URL的请求(例如,在我的图像标记中)不会传递任何这些Cookie。这导致

<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

让我们更详细地介绍一下,以防人们想知道下一步是什么,让我们使用上面的示例:-

  • 您正在my.fancy.site.mydomain.com上开发
  • 您的Cloudfront CNAME别名为content.mydomain.com
  • 确保从您的高级应用程序中将cloudfront签名cookie设置为.mydomain.com
  • 从这一点开始,您可以为CF传递cookie
  • 一种快速测试cookie设置是否正确的方法是,尝试获取资产URL,然后直接将URL放入浏览器中。如果cookie设置正确,您将能够直接访问该文件 如果您使用javascript获取cdn资产,请确保在JS代码中,您需要传递withCredentials选项,否则它将不起作用。例如,如果您使用的是jQuery,则需要以下内容:-

    $.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'
    });