#amazon-s3
#amazon-s3
Вопрос:
Я читаю следующее руководство:
https://devcenter.heroku.com/articles/s3-upload-node#uploading-directly-to-s3
Первым шагом является выбор пользователем изображения
function s3_upload(){
var s3upload = new S3Upload({
file_dom_selector: '#files',
s3_sign_put_url: '/sign_s3',
onProgress: function(percent, message) {
// some code
},
onFinishS3Put: function(public_url) {
// some cde
},
onError: function(status) {
// somecode
}
});
}
Теперь s3_sign_put_url ссылается на функцию на стороне сервера, которая возвращает
app.get('/sign_s3', function(req, res){
...
// calculates signature (signature variable)
// sets expiration time (expires variable)
var credentials = {
signed_request: url "?AWSAccessKeyId=" AWS_ACCESS_KEY "amp;Expires=" expires "amp;Signature=" signature,
url: url
};
...
}
Если я уже вычислил подпись как функцию (AWS_SECRET_KEY) следующим образом:
var signature = crypto.createHmac('sha1', AWS_SECRET_KEY).update(put_request).digest('base64');
signature = encodeURIComponent(signature.trim());
signature = signature.replace('+',' ');
Вопрос:
Почему я должен передавать значение AWS_SECRET_KEY как часть объекта credentials, возвращаемого функцией s3_sign? почему подписи недостаточно для возврата? разве это не проблема безопасности?
Ответ №1:
Вы этого не делаете.
Возвращенные учетные данные содержат AWS_ACCESS_KEY, а не AWS_SECRET_KEY.
Ключ доступа аналогичен имени пользователя… это необходимо S3, чтобы он знал, кто создал подпись. Исходя из этого, S3 ищет связанный секретный ключ внутри, создает подпись для запроса, и если это та же подпись, что и сгенерированная вами, и предоставленный ключ доступа связан с пользователем, имеющим разрешение на выполнение операции, она выполняется успешно.
Ключ доступа и секретный ключ работают как пара, и один не может быть разумно получен из другого; ключ доступа не считается закрытым, в то время как секретный ключ является.