所以我有一个私人CDN(不能通过S3访问数据,只能通过签名的URL和cookie),使用CloudFront保存Web应用程序的一些文件。
我网站上的其中一个页面显示的图片的来源位于cdn。
<img src="cdn.example.com/images/file.jpg">
现在,当我在服务器上生成签名URL时,我可以将其传递给客户端并将其设置为源...轻松
但是当我尝试使用签名的cookie做同样的事情时,我遇到了两个问题:
我使用node,express和cookie-parser。 我对这些东西很新,所以感谢任何帮助
答案 0 :(得分:4)
您是否检查过该Cookie的域名是否与Cloudfront cdn的子域名相同?
只有来自相关域的cookie才会包含在对云端分发的请求中。例如,如果您使用“localhost”进行本地测试,则无法使用“localhost”,因为cookie域是“localhost”,但签名的cookie域是“cdn.example.com”。
确保域名正确无误:
为CloudFront分配设置CNAME,例如 http://cnd.example.com
确保签名的cookie正确无误 域名例如域名:'*。example.com'将与域名匹配。
这里有一篇好文章: 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