情景:我在Google網絡存儲上放置了一些文件。如何使用Google雲端存儲隱藏真實網址?
而我想只付費的用戶可以下載此文件。所以我的問題是,如何從付費用戶隱藏這個文件,以防止他們與其他無償用戶分享這個網址。
那麼,有沒有辦法隱藏真正的文件位置?一次性或時間受限的URL或其他?
可能隱藏URL可能與其他CDN提供商--Microsoft Azure存儲或Amazon S3?
情景:我在Google網絡存儲上放置了一些文件。如何使用Google雲端存儲隱藏真實網址?
而我想只付費的用戶可以下載此文件。所以我的問題是,如何從付費用戶隱藏這個文件,以防止他們與其他無償用戶分享這個網址。
那麼,有沒有辦法隱藏真正的文件位置?一次性或時間受限的URL或其他?
可能隱藏URL可能與其他CDN提供商--Microsoft Azure存儲或Amazon S3?
Amazon S3提供查詢字符串認證(通常被稱爲預簽署網址)用於該目的,請參閱Using Query String Authentication:
查詢字符串認證用於給出HTTP或瀏覽器 對資源的訪問是有用這通常需要認證。查詢字符串中的 簽名可確保請求的安全。查詢字符串 身份驗證請求需要到期日期。 [...]
所有AWS Software Development Kits (SDKs)提供這種支持,下面是一個使用GetPreSignedUrlRequest Class從AWS 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);
}
一種方法是創建一個只包含付費用戶的Google羣組。然後,對於感興趣的對象,將讀取權限授予組的電子郵件地址(通過對象的訪問控制列表)。通過這種安排,只有您的付費會員才能下載這些投影對象。如果該羣組以外的人嘗試訪問該網址,他們將會收到訪問被拒絕的錯誤。
設置完成後,您可以通過編輯組成員資格來控制哪些人可以訪問您的對象,而無需混淆對象ACL。
Azure存儲具有共享訪問簽名的概念。它基本上是BLOB(文件)的URL,其參數限制訪問。我相信它與Steffen Opel的答案中提到的Amazon S3查詢字符串身份驗證幾乎完全相同。
Microsoft提供了a .NET library來處理共享訪問簽名。他們還提供您需要推出自己的圖書館的documentation。
感謝您指出此功能(+1),它確實看起來與Amazon S3查詢字符串驗證非常相似;它甚至可以配置可選的啓動時間以用於此類鏈接以及所需的過期時間,這對於特定用例是一個值得歡迎的改進! – 2012-03-19 12:26:13
在谷歌雲存儲,您可以使用已簽署的網址做到這一點: https://developers.google.com/storage/docs/accesscontrol#Signed-URLs
這裏是真正隱藏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);
}
}
但是,並非所有的客戶都有Google帳戶。 – FFire 2012-03-16 08:46:07