![](/img/trans.png)
[英]How to use my signed-certificate to generate pre-signed URL to object at 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
舉些例子:
您的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" # }
用戶使用臨時憑據安全地上載對象。
請注意,使用臨時憑證時,必須使用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.