2

シナリオ:GoogleのWebストレージにいくつかのファイルを配置します。

そして、有料ユーザーだけがこのファイルをダウンロードできるようにしたいと思います。だから私の質問は、このファイルを有料ユーザーから隠して、他の無料ユーザーとこのURLを共有できないようにする方法です。

それで、実際のファイルの場所を隠す方法はありますか?使い捨てまたは時間制限のあるURLまたはその他のURL?

他のCDNプロバイダー(MIcrosoft AzureStorageまたはAmazonS3)でURLを非表示にすることが可能である可能性がありますか?

4

5 に答える 5

2

これを行うには、Google Cloud Storageの署名付きURLを使用できます: https ://developers.google.com/storage/docs/accesscontrol#Signed-URLs

于 2012-03-21T00:31:11.233 に答える
2

Amazon S3は、この目的のためにクエリ文字列認証(通常は事前署名されたURLと呼ばれます)を提供します。クエリ文字列認証の使用を参照してください。

クエリ文字列認証は、通常は認証を必要とするリソースへのHTTPまたはブラウザアクセスを提供するのに役立ちます。クエリ文字列の署名は、リクエストを保護します。クエリ文字列認証要求には有効期限が必要です。[...]

すべてのAWSソフトウェア開発キット(SDK)がこれをサポートしています。これは、AWS SDK for .NETのGetPreSignedUrlRequestクラスを使用して、 42分後に有効期限が切れる事前署名されたURLを生成する例です。

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);
}
于 2012-03-16T11:35:38.117 に答える
2

Azure Storageには、共有アクセス署名の概念があります。これは基本的に、アクセスを制限するパラメーターを持つBLOB(ファイル)のURLです。SteffenOpelの回答で言及されているAmazonS3クエリ文字列認証とほぼ同じだと思います。

Microsoftは、共有アクセス署名を処理するための.NETライブラリを提供しています。また、独自のライブラリを作成するために必要なドキュメントも提供します。

于 2012-03-16T19:58:23.303 に答える
1

1つの方法は、有料ユーザーのみを含むGoogleグループを作成することです。次に、対象のオブジェクトについて、グループの電子メールアドレスに(オブジェクトのアクセス制御リストを介して)読み取りアクセス許可を付与します。その取り決めでは、有料会員のみがこれらの投影されたオブジェクトをダウンロードできます。そのグループ外の誰かがURLにアクセスしようとすると、アクセス拒否エラーが発生します。

これを設定すると、オブジェクトACLをいじることなく、グループメンバーシップを編集することで、オブジェクトにアクセスできるユーザーを制御できるようになります。

于 2012-03-16T07:35:53.597 に答える
1

これは、S3URLを本当に隠す代替手段です。このアプローチでは、実行可能性が制限されたクエリ文字列認証済みURLを作成する代わりに、ユーザーのリクエストを受け取り、ユーザーを承認し、S3データをフェッチして、最後にデータをリクエスターに返します。

このアプローチの利点は、有効期間中のクエリ文字列認証済みURLの場合のように、ユーザーがS3 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 );
    } 
}
于 2013-09-05T08:35:28.040 に答える