0

私はRailsのバックエンドを持っていて、それは私に "署名"文字列、 "objectKey"文字列と "ポリシー"文字列を返します。これらのパラメータを使用してユーザーが選択したファイルをアップロードする必要がありますが、Amazon JavaScript SDKを使用して「accessKey」と「accessSecretKey」の代わりにこれらのパラメータを使用する方法はありません。SDKを使用してAmazon S3にファイルをアップロードするために、バックエンドの事前に署名されたURLを使用するにはどうすればよいですか?

私はすでにアップロードを行うコードを持っていますが、資格情報を直接使用していて、安全ではありません。

誰でもこの問題に直面していますか?

+0

バケットにCORSポリシーを追加する必要があります。これにより、バケット上の署名を使用して他の操作が可能になります。 – datasage

+0

@datasageこんにちは。バケットには既にCORSがあります。主な問題は、フロントエンドで自分の資格情報(アクセスキーとアクセス秘密鍵)を直接使用することができないことです。開発時に使用していて、動作しています。バックエンドから送られてきたjsonペイロードがあります署名、ポリシーハッシュ、およびオブジェクトキーをファイルに追加します。これらのパラメータは、Rails sdkを使用してバックエンドによって生成されます。 S3 Javascript sdkを使用してファイルを送信すれば十分ですか?私は秘密鍵なしでフロントエンドからファイルを送る方法を知らない。 –

+0

はい、アクセスキーと生成した署名が必要です。このサンプルを見てください:http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-post-example.html – datasage

答えて

0

JavaScriptのAWS Sdkで私の問題の解決策が見つかりませんでした。

我々の場合には、ワークフロー(署名/ポリシー世代)にIは、単純なXmlHttpRequestのにSDKを置き換えこの問題およびいるFormDataオブジェクトを解決するために、この資料に示さhttps://aws.amazon.com/articles/1434

の同じである、ことを見えます私のファイルをs3にプッシュします。ペイロードは、アプリケーションの他の部分との互換性を維持するために変更することはできませんでした。この方法を使用するには、AccessKey、ポリシー、署名、キー(ファイルキー)、およびファイルをformDataに格納する必要があります。ポリシー/署名がどのように生成されたかによって、formDataに他のフィールドを追加して機能させる必要があります。この場合、私はsucess_action_statusを追加しました。

FORMDATAマウントするためのコード:、このフォームデータと

var formData = new FormData(); 
    formData.append('key', <KEY>); 
    formData.append('AWSAccessKeyId', <ACCESS_KEY>); 
    formData.append('policy', <POLICY>); 
    formData.append('signature', <SIGNATURE>); 
    formData.append('success_action_status', <SUCCESS_CODE>); 
    formData.append('file', file, file.name); 

をこの

var request = new XMLHttpRequest(); 
request.open("POST","https://<YOUR BUCKET>.s3.amazonaws.com"); 
request.setRequestHeader("enctype", "multipart/form-data"); 

ようにXMLHttpRequestを作成し、FORMDATAオブジェクトを渡す要求を送信します。

request.send(formData); 

formDataの値は、生成されたポリシーを尊重する必要があります。

それは、このリスナーを追加することにより、アップロードプロセスを取得することが可能です:

request.upload.addEventListener('progress', function(e){ 
     console.log(e); 
}); 

は助けありがとうございました。

0

登録されたURLを持つオブジェクトをアップロードすることはできません。 AWSには、AWS Security Token Serviceと呼ばれる一時的な資格情報を付与するためのソリューションがあります。短い名前はAWS STSです。例については

Requesting Temporary Security Credentials - AWS Identity and Access Management

は:

  1. ユーザーがあなたのRailsアプリケーションにアクセスします。
  2. あなたのレールアプリケーションは、AWS STSを使用して一時的な資格情報を発行して返します。

    client = Aws::STS::Client.new 
    policy = AWS::STS::Policy.new do |p| 
        p.allow(
        actions: ['s3:PutObject'], 
        resources: ['arn:aws:s3:::some-bucket/path/to/xxx*'], 
        effect: 'allow' 
    ) 
    end 
    
    token = client.get_federation_token(name: 'name', policy: policy.to_json, duration_seconds: 900) 
    puts token.credentials.to_json 
    # { 
    # "access_key_id": "XXXXXXXXXXXXXXXXXXXX", 
    # "secret_access_key": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 
    # "session_token": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", 
    # "expiration": "2016-03-25T00:46:20Z" 
    # } 
    
  3. ユーザーは、一時的な資格情報を使用してオブジェクトを安全にアップロードします。あなたは一時的な資格情報を使用する場合、あなたはaccess_key_id、secret_access_keyとsession_tokenで認証しなければならないこと

は注意してください。

+0

ありがとうございました。しかし、現在、私は私のバックエンドコードを変更することはできませんアクセスキーのID、秘密のアクセスキーとセッショントークンを生成する...これらのパラメータは本当に必須です、私はペイロードでそれらを提供するバックエンドの開発者に伝える必要があります。 –

+0

私が知る限り、このソリューションは、ユーザーがブラウザからファイルを安全にアップロードする唯一の方法です。私はバックエンドの開発者がそれを開発することを願っています。がんばろう! – Nori

+0

"予約済みのURLを持つオブジェクトをアップロードすることはできません"。次の記事「事前署名されたURLを使用したオブジェクトのアップロード」は、別の方法で提案されています。http://docs.aws.amazon.com/AmazonS3/latest/dev/PresignedUrlUploadObject.html –

関連する問題