场景:我将一些文件放在 Google 网络存储上。
我希望只有付费用户才能下载这个文件。所以我的问题是,如何向付费用户隐藏此文件,以防止他们与其他未付费用户共享此 URL。
那么,有没有办法隐藏真实的文件位置?一次性或有时间限制的 URL 或任何其他?
其他 CDN 提供商可能会隐藏 URL - MIcrosoft Azure Storage 或 Amazon S3?
场景:我将一些文件放在 Google 网络存储上。
我希望只有付费用户才能下载这个文件。所以我的问题是,如何向付费用户隐藏此文件,以防止他们与其他未付费用户共享此 URL。
那么,有没有办法隐藏真实的文件位置?一次性或有时间限制的 URL 或任何其他?
其他 CDN 提供商可能会隐藏 URL - MIcrosoft Azure Storage 或 Amazon S3?
您可以使用 Google Cloud Storage 中的签名 URL 来执行此操作: https ://developers.google.com/storage/docs/accesscontrol#Signed-URLs
为此,Amazon S3提供查询字符串身份验证(通常称为预签名 URL ),请参阅使用查询字符串身份验证:
查询字符串身份验证对于让 HTTP 或浏览器访问通常需要身份验证的资源很有用。查询字符串中的签名保护请求。查询字符串身份验证请求需要到期日期。[...]
所有AWS 软件开发工具包 (SDK)都对此提供支持,下面是一个使用适用于 .NET的AWS 开发工具包中的GetPreSignedUrlRequest 类的示例,生成一个预签名 URL,该 URL 将在 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);
}
这是真正隐藏 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 );
}
}
一种方法是创建一个仅包含您的付费用户的 Google Group。然后,对于感兴趣的对象,授予组电子邮件地址的读取权限(通过对象的访问控制列表)。通过这种安排,只有您的付费会员才能下载这些投影对象。如果该组以外的人尝试访问该 URL,他们将收到拒绝访问错误。
设置完成后,您将能够通过编辑组成员身份来控制谁可以访问您的对象,而无需弄乱对象 ACL。