2012-03-16 53 views
1

情景:我在Google网络存储上放置了一些文件。如何使用Google云端存储隐藏真实网址?

而我想只付费的用户可以下载此文件。所以我的问题是,如何从付费用户隐藏这个文件,以防止他们与其他无偿用户分享这个网址。

那么,有没有办法隐藏真正的文件位置?一次性或时间受限的URL或其他?

可能隐藏URL可能与其他CDN提供商--Microsoft Azure存储或Amazon S3?

回答

2

Amazon S3提供查询字符串认证(通常被称为预签署网址)用于该目的,请参阅Using Query String Authentication

查询字符串认证用于给出HTTP或浏览器 对资源的访问是有用这通常需要认证。查询字符串中的 签名可确保请求的安全。查询字符串 身份验证请求需要到期日期。 [...]

所有AWS Software Development Kits (SDKs)提供这种支持,下面是一个使用GetPreSignedUrlRequest ClassAWS SDK for .NET,生成预签名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); 
} 
0

一种方法是创建一个只包含付费用户的Google群组。然后,对于感兴趣的对象,将读取权限授予组的电子邮件地址(通过对象的访问控制列表)。通过这种安排,只有您的付费会员才能下载这些投影对象。如果该群组以外的人尝试访问该网址,他们将会收到访问被拒绝的错误。

设置完成后,您可以通过编辑组成员资格来控制哪些人可以访问您的对象,而无需混淆对象ACL。

+0

但是,并非所有的客户都有Google帐户。 – FFire 2012-03-16 08:46:07

1

Azure存储具有共享访问签名的概念。它基本上是BLOB(文件)的URL,其参数限制访问。我相信它与Steffen Opel的答案中提到的Amazon S3查询字符串身份验证几乎完全相同。

Microsoft提供了a .NET library来处理共享访问签名。他们还提供您需要推出自己的图书馆的documentation

+0

感谢您指出此功能(+1),它确实看起来与Amazon S3查询字符串验证非常相似;它甚至可以配置可选的启动时间以用于此类链接以及所需的过期时间,这对于特定用例是一个值得欢迎的改进! – 2012-03-19 12:26:13

0

这里是真正隐藏S3 URL的替代品。这种方法不是创建一个具有有限可行性的查询字符串认证URL,而是接受用户的请求,授权用户,获取S3数据,并最终将数据返回给请求者。

这种方法的好处是用户无法知道S3 URL,并且无法将URL传递给任何其他人,例如查询字符串验证URL在其有效期内的情况。这种方法的缺点是:1)在S3“中间”有一个额外的中介,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); 
    } 
} 
相关问题