簡體   English   中英

如何使用后端預簽名URL使用其SDK將文件上傳到Amazon S3?

[英]How can i use a backend pre-signed url to upload files to Amazon S3 using its SDK?

我有一個Rails后端,它返回給我一個“簽名”字符串,“ objectKey”字符串和一個“策略”字符串。 我必須使用這些參數來上傳用戶選擇的文件,但是我找不到任何使用這些參數的方法,而不是使用Amazon JavaScript SDK的“ accessKey”和“ accessSecretKey”。

我已經有一個進行上傳的代碼,但是它直接使用了憑據,而且看起來不安全。

有人已經遇到這個問題了嗎?

您無法上傳帶有預簽名網址的對象。 AWS提供了一種解決方案來授予稱為AWS安全令牌服務的臨時憑證。 簡稱為AWS STS。

請求臨時安全憑證-AWS Identity and Access Management

舉些例子:

  1. 用戶訪問您的Rails應用程序。
  2. 您的rails應用程序將使用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進行身份驗證。

找不到適用於JavaScript的AWS Sdk的問題的解決方案。

看起來,在我們的例子中,工作流(簽名/策略生成)與本文中顯示的相同https://aws.amazon.com/articles/1434

為了解決此問題,我將Sdk替換為簡單的XmlHttpRequest和FormData對象,以將文件推送到s3。 有效負載無法更改以保持與應用程序其他部分的兼容性。 使用這種方法,必須在formData中具有一個AccessKey,策略,簽名,密鑰(文件密鑰)和文件。 根據策略/簽名的生成方式,還需要向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);

使用此表單數據,像這樣創建XMLHttpRequest

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

並發送通過formData對象的請求。

request.send(formData);

重要的是要記住,formData中的值必須遵守生成的策略。

可以通過添加以下監聽器來獲得上傳過程:

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

謝謝大家的幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM