场景:我在Google网络存储上放置了一些文件。
我希望只有付费用户才能下载此文件。所以我的问题是,如何从付费用户隐藏此文件,以防止他们与其他未付费用户共享此网址。
那么,有没有办法隐藏真实的文件位置?一次性或限时URL或其他任何URL?
可能隐藏URL可能与其他CDN提供商 - MIcrosoft Azure存储或Amazon S3?
答案 0 :(得分:2)
Amazon S3提供了查询字符串身份验证(通常称为预签名网址),请参阅Using Query String Authentication:
查询字符串身份验证对于提供HTTP或浏览器非常有用 访问通常需要身份验证的资源。该 查询字符串中的签名可以保护请求。请求参数 身份验证请求需要到期日期。 [...]
所有AWS Software Development Kits (SDKs)都为此提供支持,以下是使用GetPreSignedUrlRequest Class中AWS SDK for .NET的示例,生成预签名网址,此后42分钟即将到期:
using (var s3Client = AWSClientFactory.CreateAmazonS3Client("AccessKey", "SecretKey"))
{
GetPreSignedUrlRequest request = new GetPreSignedUrlRequest()
.WithBucketName("BucketName")
.WithKey("Key")
.WithProtocol(Protocol.HTTP)
.WithExpires(DateTime.Now.AddMinutes(42));
string url = s3Client.GetPreSignedURL(request);
}
答案 1 :(得分:1)
Azure存储具有共享访问签名的概念。它基本上是具有限制访问的参数的BLOB(文件)的URL。我相信它几乎与Steffen Opel的答案中提到的Amazon S3查询字符串身份验证相同。
Microsoft提供a .NET library来处理共享访问签名。它们还提供了滚动自己库所需的documentation。
答案 2 :(得分:1)
您可以使用Google云端存储中的签名网址执行此操作: https://developers.google.com/storage/docs/accesscontrol#Signed-URLs
答案 3 :(得分:0)
一种方法是创建仅包含付费用户的Google网上论坛。然后,对于感兴趣的对象,授予组的电子邮件地址的读取权限(通过对象的访问控制列表)。通过这种安排,只有您的付费会员才能下载这些投影对象。如果该组外的某个人试图访问该URL,他们将收到拒绝访问错误。
设置完成后,您将能够通过编辑组成员资格来控制谁可以访问您的对象,而无需弄乱对象ACL。
答案 4 :(得分:0)
这是一个真正隐藏S3 URL的替代方案。此方法不是创建具有有限可行性的查询字符串经过身份验证的URL,而是接受用户的请求,授权用户,获取S3数据,最后将数据返回给请求者。
这种方法的优点是用户无法知道S3 URL并且无法将URL传递给任何其他人,就像在其有效期内查询字符串经过身份验证的URL一样。这种方法的缺点是:1)在S3“get”中间有一个额外的中介,2)可能会产生额外的带宽费用,具体取决于S3数据实际驻留的位置。
public void streamContent( User requestor, String contentFilename, OutputStream outputStream ) throws Exception {
// is the requestor entitled to this content?
Boolean isAuthorized = authorizeUser( requestor, filename );
if( isAuthorized ) {
AWSCredentials myCredentials = new BasicAWSCredentials( s3accessKey, s3secretKey );
AmazonS3 s3 = new AmazonS3Client( myCredentials );
S3Object object = s3.getObject( s3bucketName, contentFilename );
FileCopyUtils.copy( object.getObjectContent(), outputStream );
}
}