如何在浏览器中使用CloudFront签名的cookie?

时间:2017-02-01 22:15:19

标签: javascript node.js express cookies amazon-cloudfront

所以我有一个私人CDN(不能通过S3访问数据,只能通过签名的URL和cookie),使用CloudFront保存Web应用程序的一些文件。

我网站上的其中一个页面显示的图片的来源位于cdn。

<img src="cdn.example.com/images/file.jpg">

现在,当我在服务器上生成签名URL时,我可以将其传递给客户端并将其设置为源...轻松

但是当我尝试使用签名的cookie做同样的事情时,我遇到了两个问题:

  1. 在生成已签名的服务器端cookie后,我使用 res.cookie 进行设置,但我不确定如何在客户端找到它们。
  2. 如果在客户端实际获取cookie(在angular / javascript中),如何设置&#34;设置&#34;这样当浏览器试图抓住上面提到的html中的图像时它允许访问?
  3. 我使用node,express和cookie-parser。 我对这些东西很新,所以感谢任何帮助

2 个答案:

答案 0 :(得分:4)

您是否检查过该Cookie的域名是否与Cloudfront cdn的子域名相同?

只有来自相关域的cookie才会包含在对云端分发的请求中。例如,如果您使用“localhost”进行本地测试,则无法使用“localhost”,因为cookie域是“localhost”,但签名的cookie域是“cdn.example.com”。

确保域名正确无误:

  1. 为CloudFront分配设置CNAME,例如 http://cnd.example.com

  2. 确保签名的cookie正确无误     域名例如域名:'*。example.com'将与域名匹配。

  3. 这里有一篇好文章: https://www.spacevatican.org/2015/5/1/using-cloudfront-signed-cookies/

    还有一个很好的节点模块用于创建签名的cookie: https://github.com/jasonsims/aws-cloudfront-sign

    使用此模块,您可以执行以下操作:

    const options = {
        keypairId: YOUR_ACCESS_ID,
        privateKeyPath: PATH_TO_PEM_FILE
    };
    
    const signedCookies = cf.getSignedCookies("http://cdn.example.com/*", options);
    
    for (const cookieId in signedCookies) {
        res.cookie(cookieId, signedCookies[cookieId], {domain: ".example.com"});
    }
    

    请注意我设置域名的方式。如果没有明确设置,它将默认为发出请求的那个,这可能不是您想要的。

    最后,为了在本地测试,我在家庭网络上设置了端口转发,并在GoDaddy中创建了一个CNAME,指向我的家庭IP,例如“test.example.com”。然后我使用“http://test.example.com”代替“http://localhost”。这创建了一个带有子域“test.example.com”的cookie。最后,我在GoDaddy中创建了另一个名为“cdn.example.com”的CNAME,将其指向CloudFront网址。我在我签名的cookie中使用了通配符域“.example.com”,因为我现在在同一个域“example.com”上有已签名的cookie,它会被传递到CloudFront并且我们已经升空了!

答案 1 :(得分:2)

对于那些尝试从其他域访问CloudFront中受保护资源的用户,您无法设置cookie跨域,因此您只能使用签名URL。但是,您可以在CloudFront站点上使用javascript来使用Signed URL中的参数直接在CloudFront中创建Signed Cookie。我整理了一个简单的JS脚本来做到这一点。

aws-signed-cookie-from-signed-url.js

  • 在www.mysite.com中构建签名的URL,该URL指向CloudFront URL www.cloudfronturl.com/sample/index.html
  • 将JS包含在CloudFront资源“ sample / index.html”中
  • 在用户使用签名的URL时,index.html将创建SignedCookie,该签名的Cookie将允许www.cloudfronturl.com/sample中的所有其他导航基于cookie进行工作