Javascript 如何在浏览器中使用CloudFront签名Cookie?
因此,我有一个使用CloudFront的私有CDN(不能通过S3访问数据,只能通过签名URL和cookies),它为web应用程序保存一些文件 我的站点上的一个页面显示一个图像,其源位于cdn上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后,
<img src="cdn.example.com/images/file.jpg">
现在,当我在服务器上生成一个已签名的URL时,我可以将其传递给客户端并将其设置为源代码…很简单
但当我尝试使用签名cookies做同样的事情时,我遇到了两个问题:
我对这方面的知识还比较陌生,因此非常感谢您的帮助您是否检查了cookie的域是否与cloudfront cdn的域相同或是子域 只有来自相关域的cookie才会包含在对cloudfront发行版的请求中。例如,如果您正在使用“localhost”进行本地测试,而该“localhost”不会像cookie域那样工作,它是“localhost”,但签名的cookie域是“cdn.example.com” 要确保域是正确的,请执行以下操作:
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工作