Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js S3,签名URL和缓存_Node.js_Amazon Web Services_Amazon S3_Knox Amazon S3 Client - Fatal编程技术网

Node.js S3,签名URL和缓存

Node.js S3,签名URL和缓存,node.js,amazon-web-services,amazon-s3,knox-amazon-s3-client,Node.js,Amazon Web Services,Amazon S3,Knox Amazon S3 Client,我正在使用knox nodejs库在我的webapp(nodejs)上生成签名URL。 然而问题出现了,对于每个请求,我都需要为当前用户重新生成一个唯一的GET signed url,从而使浏览器的缓存控制不在游戏中 我在网上搜索没有成功,因为浏览器似乎使用完整的url作为缓存键,所以我真的很好奇,在给定的情况下(nodejs、knox库),如何解决问题并使用缓存控制,同时仍然能够为每个请求生成签名url,因为我需要验证用户的访问权限 但是,我不敢相信没有解决方案。如果您将CloudFront与

我正在使用knox nodejs库在我的webapp(nodejs)上生成签名URL。 然而问题出现了,对于每个请求,我都需要为当前用户重新生成一个唯一的GET signed url,从而使浏览器的缓存控制不在游戏中

我在网上搜索没有成功,因为浏览器似乎使用完整的url作为缓存键,所以我真的很好奇,在给定的情况下(nodejs、knox库),如何解决问题并使用缓存控制,同时仍然能够为每个请求生成签名url,因为我需要验证用户的访问权限


但是,我不敢相信没有解决方案。

如果您将CloudFront与S3一起使用,您可以使用自定义策略,如果您将每个url限制为用户的IP和合理的长超时,这意味着当他们再次请求相同的内容时,他们将获得相同的URL,因此他们的浏览器可以缓存内容,但该URL将不适用于其他人(在不同的IP上)


(请参阅:)

我正在使用Java AmazonS3客户端,但过程应该是相同的

有一种策略可以用来处理这种情况

您可以使用固定日期时间作为到期日期。我将此日期设置为明天下午12点


现在,每次你生成一个url,它将在当天一直保持不变,直到00:00。这样可以在一定程度上使用浏览器缓存。

扩展@semir deljićAnswer

每次调用
getSignedUrl
函数时,它都会生成新的URL。这将导致即使存在
缓存控制
标头,图像也不会被缓存

因此,我们使用计时器库来冻结时间。现在,当调用函数时,它认为时间还没有过去,并返回相同的URL

const moment=require('moment');
常数tk=要求(“计时器”);
函数url4download(awsPath、awsKey){
函数getFrozenDate(){
返回时刻().startOf('week').toDate();
}
//getSignedUrl函数的参数
常量参数={
//参考:https://docs.aws.amazon.com/AmazonS3/latest/API/API_GetObject.html
//参考:https://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-query-string-auth.html
桶:awsBucket,
键:`${awsPath}/${awsKey}`,
//604800==7天
ResponseCacheControl:`public,最大年龄=604800,不可变`,
过期时间:604800,//最多7天
};
const url=tk.withFreeze(getFrozenDate(),()=>{
返回S3.getSignedUrl('getObject',params);
});
返回url;
}
注意: 使用
moment().toDate()
,因为计时器需要本机日期对象

即使使用
knox
library是个棘手的问题,我的答案还是使用aws官方图书馆

//AWS&S3就是这样初始化的。
const AWS=require('AWS-sdk');
常数S3=新的AWS.S3({
accessKeyId:awsAccessId,
secretAccessKey:awsSecretKey,
地区:“ap-south-1”,
apiVersion:‘2006-03-01’,
签名版本:“v4”,
});

灵感:

一个建议:将签名部分从URL中删除,并添加自定义http头以进行身份验证。我很好奇这是否可能与knox库实现。尽管有相同的难题,但您是否找到了解决方法/这对我不起作用,因为用户可能会频繁更改其IP:(@anderswellt)你找到解决方案了吗?我在android上也遇到了同样的问题。很好。完整解释: