Javascript 如何在浏览器中使用CloudFront签名Cookie?

Javascript 如何在浏览器中使用CloudFront签名Cookie?,javascript,node.js,express,cookies,amazon-cloudfront,Javascript,Node.js,Express,Cookies,Amazon Cloudfront,因此,我有一个使用CloudFront的私有CDN(不能通过S3访问数据,只能通过签名URL和cookies),它为web应用程序保存一些文件 我的站点上的一个页面显示一个图像,其源位于cdn上 <img src="cdn.example.com/images/file.jpg"> 现在,当我在服务器上生成一个已签名的URL时,我可以将其传递给客户端并将其设置为源代码…很简单 但当我尝试使用签名cookies做同样的事情时,我遇到了两个问题: 在服务器端生成签名cookie后,

因此,我有一个使用CloudFront的私有CDN(不能通过S3访问数据,只能通过签名URL和cookies),它为web应用程序保存一些文件

我的站点上的一个页面显示一个图像,其源位于cdn上

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

现在,当我在服务器上生成一个已签名的URL时,我可以将其传递给客户端并将其设置为源代码…很简单

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

  • 在服务器端生成签名cookie后,我使用res.cookie设置它们,但我不确定如何在客户端找到它们作为响应
  • 如果在客户端实际获取cookie(在angular/javascript中),我如何“设置”它,以便当浏览器试图获取上述html中的图像时,它允许访问 我正在使用node、express和cookie解析器。
    我对这方面的知识还比较陌生,因此非常感谢您的帮助

    您是否检查了cookie的域是否与cloudfront cdn的域相同或是子域

    只有来自相关域的cookie才会包含在对cloudfront发行版的请求中。例如,如果您正在使用“localhost”进行本地测试,而该“localhost”不会像cookie域那样工作,它是“localhost”,但签名的cookie域是“cdn.example.com”

    要确保域是正确的,请执行以下操作:

  • 为CloudFront分发设置一个CNAME,例如。

  • 确保签名的cookie具有正确的 域,例如域:“*.example.com”将与域匹配

  • 这里有一篇好文章:

    还有一个很好的用于创建签名cookie的节点模块:

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

    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”。然后我用了“而不是”。这创建了一个具有子域“test.example.com”的cookie。最后,我在GoDaddy中创建了另一个名为“cdn.example.com”的CNAME,将其指向CloudFront url。我在我的签名cookie“.example.com”中使用了通配符域,因为我现在在同一个域“example.com”上有签名cookie,它被传递到了CloudFront,我们已经升空了

    对于那些试图从不同域访问CloudFront中受保护资源的用户,您不能跨域设置cookie,因此只能使用签名URL。但是,您可以在CloudFront站点上使用javascript,使用签名URL中的参数直接在CloudFront中创建签名Cookie。我编写了一个简单的JS脚本,可以实现这一点

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

    我已使用您的js成功创建了cookie,并能够通过浏览器URL下载m3u8文件,但仍然无法使用我的域上的CloudFront链接访问私人视频。我错过什么了吗?