如何使用Google云端存储隐藏真实网址?

时间:2012-03-16 06:40:37

标签: amazon-s3 azure-storage google-cloud-storage

场景:我在Google网络存储上放置了一些文件。

我希望只有付费用户才能下载此文件。所以我的问题是,如何从付费用户隐藏此文件,以防止他们与其他未付费用户共享此网址。

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

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

5 个答案:

答案 0 :(得分:2)

为此,

Amazon S3提供了查询字符串身份验证(通常称为预签名网址),请参阅Using Query String Authentication

  

查询字符串身份验证对于提供HTTP或浏览器非常有用   访问通常需要身份验证的资源。该   查询字符串中的签名可以保护请求。请求参数   身份验证请求需要到期日期。 [...]

所有AWS Software Development Kits (SDKs)都为此提供支持,以下是使用GetPreSignedUrlRequest ClassAWS 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 );
    } 
}