どのようにあなたのサイトにプレミアム/プライベートコンテンツを提供するには?


多くのオンライン企業(例えば:Netflix、UDEMYなど)は、サイトのメンバーだけにアクセス可能であるか、予約をしたか、プレミアムを支払ったインターネット上で内容を分配します.今日このポストでは、Amazon Webサービスを使用してあなたのウェブサイトのためにこれを達成する方法を参照してください.私たちはどのように安全にあなたのユーザーにAWS

プリサインされたURLは何ですか?


プリサインされたURLは、要求をするために限られた許可と時間を提供するURLです.予め署名されたURLを受け取る誰でも、それからオブジェクトにアクセスすることができます.たとえば、あなたのバケツでファイルを持っていて、両方のバケツとオブジェクトがプライベートであるならば、あなたはプリサインされたURLを生成することによって、他とファイルを共有することができます.

プリサインされたURLに関する重要なポイント

  • プリサインされたURLの作成者は、働くためにURLのためにオブジェクトにアクセスしなければなりません.
  • あなたは使用できないか、動作しないプリサインされたURLを作成できます.
  • それは、あらかじめ署名されたURLを作成する何かを要しません.
  • は、URL
  • の満了時間を設定することができます
  • 一時的なトークンを使ってプリサインされたURLを作成した場合、URLが期限切れになったときにURLが期限切れになります.
  • URLを作成したユーザーからオブジェクトにアクセスするアクセス許可を削除することでURLを取り消すことができます.
  • プリサインされたURLを作成する方法?


    オブジェクトのプリ署名されたURLを作成するときは、セキュリティ資格情報を提供し、バケット名、オブジェクトキー、指定メソッドおよび有効期限を指定する必要があります.
    Pythonでは、BOTO 3を使用すると、GeneratorのPresignedCount URLメソッドを使用してURLを生成できます
    response = s3_client.generate_presigned_url('get_object',
                Params={'Bucket': bucket_name,
                'Key': object_name},
                ExpiresIn=expiration)
    
    レスポンスオブジェクトには、このように見えるURLが含まれます
    https://somebucketname-rep.s3.amazonaws.com/someFileName.txt?X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Credential=ASIAQS3IOUWUZF7YSXGA%2F20200821%2Fus-east-2%2Fs3%2Faws4_request&X-Amz-Date=20200821T051228Z&X-Amz-Expires=3600&X-Amz-SignedHeaders=host&X-Amz-Security-Token=FwoGZXIvYXdzEH8aDCfJDxO0y6xQxYmdGCK2AXe71W%2FgZEg%2FSnSWC%2Fw%2FaJHeZ20M7OI7AqMEum5c98Chl6pSNPwE5Awsc3ySwokDF6L8a9wP0ceXWAmxT3WXLSoFeNHDbbEHfUKWnvGL8yFzAxdmf%2Fmi%2B5Tnl62td8Nad%2F0Ct1Sx11Mip1h2qdYxw80OX5bCTq7cAHHjpmupvaDt%2BZ3qVyIA9WZmeS63dCPOlieE9IiBZf%2FjxF4Mcs5w4ZIHtZL%2F3LvqMXAy3XfzCgnlYVZeCNczKLuv%2FfkFMi0mStwkzyO%2BfMIxWJ82GJmyNi7LZuY5r0Hx0mE%2BxLnre8jp9%2FACoV%2FM92GnsR0%3D&X-Amz-Signature=17046b630ad4dede85af1cd57204bba8adc462a1825a35d93e81b656c683ad75
    
    ブラウザでこのURLを使用し、オブジェクトにアクセスできます!シンプル..じゃない?

    アクションで見る


    我々は、前の2つのポストの上にこれを実装するつもりです、in the first post、我々はカスタムアイデンティティブローカー(サインアップ/ログイン)を実行しました.second postでは、我々はAWS STSをバケツファイル名を読むために仮定していました.Githubから2番目のポストのためのダウンロードコード.com/rajanpanchal/AWS KMS STSとそれを修正しました.
    全体的なプロセスがどのように見えるかは、ここにあります

    オープンファイルshowfiles.LamdbaフォルダからPyを押し、プリコードされたURLを生成する関数を追加できます.GetFileList関数からこの関数を呼び出します.
    def getSignedUrl(key,s3_client):
        KeyUrl = {}
    
        response = s3_client.generate_presigned_url('get_object',
                            Params={'Bucket': os.environ['filesBucket'],
                            'Key': key},
                            ExpiresIn=3600)
        KeyUrl[key] = response
        return KeyUrl
    
    
    # Returns list of files from bucket using STS    
    def getFilesList():
        sts_client = boto3.client('sts')
    
        # Call the assume_role method of the STSConnection object and pass the role
        # ARN and a role session name.
        assumed_role_object=sts_client.assume_role(
            RoleArn=os.environ['s3role'],
            RoleSessionName="AssumeRoleSession1"
        )
    
        # From the response that contains the assumed role, get the temporary 
        # credentials that can be used to make subsequent API calls
        credentials=assumed_role_object['Credentials']
    
        # Use the temporary credentials that AssumeRole returns to make a 
        # connection to Amazon S3  
        s3_resource=boto3.resource(
            's3',
            aws_access_key_id=credentials['AccessKeyId'],
            aws_secret_access_key=credentials['SecretAccessKey'],
            aws_session_token=credentials['SessionToken'],
        )
        s3_client = boto3.client('s3',aws_access_key_id=credentials['AccessKeyId'],
    aws_secret_access_key=credentials['SecretAccessKey'],
    aws_session_token=credentials['SessionToken'])
        bucket = s3_resource.Bucket(os.environ['filesBucket'])
        files=[]
        for obj in bucket.objects.all():
            files.append(getSignedUrl(obj.key,s3_client))
        return files
    
    GetSigneDoll関数でプリコーディングされたURLを生成するために、前提条件から取得した一時的な資格情報を使用します.GetFileList関数はファイル名とプリサインされたURLのリストを返します.
    では、showfileを変更します.HTMLで、レスポンスを反復してファイルのリンクを作成する
    <html>
    <head>
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.css" integrity="sha512-8bHTC73gkZ7rZ7vpqUQThUDhqcNFyYi2xgDgPDHc+GXVGHXq+xPjynxIopALmOPqzo9JZj0k6OqqewdGO3EsrQ==" crossorigin="anonymous" />
    <script
      src="https://code.jquery.com/jquery-3.1.1.min.js"
      integrity="sha256-hVVnYaiADRTO2PzUGmuLJr8BLUSjGIZsDYGmIJLv2b8="
      crossorigin="anonymous"></script>
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/semantic-ui/2.4.1/semantic.min.js"></script>
    </head>
    <body>
    
    <div class="ui raised very text container">
    <h1 class="ui header">File Access System</h1>
    <i class="folder open icon"></i></i><div class="ui label">Files</div>
    <div id="files" >Loading..</div>
    </div>
    </body>
    <script>
    
    fetch(" https://g4m3zpzp95.execute-api.us-east-2.amazonaws.com/Prod/showFiles/", {
      credentials: 'include'
    })
      .then(response => response.text())
      .then((body) => {
        var files="";
    
        var obj = JSON.parse(body)
        for (i = 0; i < obj.length; i++) {
                var o = obj[i]
    
                for(x in o){
                    files =  files+ "<i class='file alternate outline icon'><a href='"+o[x]+"' target='_blank'>&nbsp;&nbsp;"+x+"</a>"
                }
        }
        document.getElementById("files").innerHTML= files
      })
      .catch(function(error) {
        console.log(error); 
      });
    
    </script>
    </html>
    
    
    ここでSAMをビルドして展開します.

    変更ログイン.HTML、サインアップ.HTMLとshowfiles.HTMLはCloudFormationの出力からAPIのURLを更新します.
    これらのファイルをバケットのstsExampleバケットまたは作成したバケットにアップロードします.これらのファイルをパブリック
    ここでコードを見つけることができます.
    https://github.com/rajanpanchal/aws-kms-sts-presigned-url

    テスト



    あなたが質問やコメントがあれば私に知らせてください!