Загружайте файлы в Amazon S3 с помощью Delphi, используя временные учетные данные безопасности

avatar
Alexander M.
25 октября 2016 в 15:09
3235
2
1

У меня есть учетная запись AWS S3 и элементы SecretAccessKey, SessionToken, Expiration, AccessKeyId. Я хотел бы загрузить некоторые файлы в облако, самым простым способом.

Прочитал некоторые документы, касающиеся заголовков авторизации (http://docs.aws.amazon.com/AmazonS3/latest/API/sigv4-auth-using-authorization-header.html), но все же не понимаю как их строить))

также видел другой пример с Indy, поэтому, пожалуйста, помогите создать заголовок авторизации с этими элементами, которые у меня есть: SecretAccessKey, SessionToken, Expiration, AccessKeyId. Можно использовать режим «Передача полезной нагрузки в одном фрагменте» + «Опция подписанной полезной нагрузки».

  FS := TFileStream.Create('c:\myfile.txt', fmOpenRead or fmShareDenyWrite);
  try
    IdHTTP1.Request.CustomHeaders.Values['Authorization'] := ...; // please help
    IdHTTP1.Request.BasicAuthentication := False;
    IdHTTP1.Request.Date := ...;   //what should I enter here?
    IdHTTP1.Request.Expect := '100-continue';
    IdHTTP1.Request.ProtocolVersion := pv1_1;
    ...
    IdHTTP1.Put('http://'+BucketName+'.s3.amazonaws.com/myfile.txt', FS);
  finally
    FS.Free;
  end;

Спасибо!

Источник
Marc Guillot
25 октября 2016 в 17:50
0

Какой Delphi вы используете? Это облачные компоненты Delphi 10, которые упрощают работу.

Alexander M.
26 октября 2016 в 15:03
0

Делфи ХЕ8. Какие компоненты в D10 используются для реализации aws auth?

Marc Guillot
26 октября 2016 в 15:41
0

TAmazonConnectionInfo, эти облачные компоненты кажутся новыми в Delphi 10. docwiki.embarcadero.com/RADStudio/Seattle/en/…

Alexander M.
26 октября 2016 в 15:47
0

вау, только что нашел TAmazonConnectionInfo в XE8, лол))) НО, не могу понять, как заставить TAmazonConnectionInfo работать с временными учетными данными безопасности (токен безопасности)

Alexander M.
26 октября 2016 в 17:42
0

следует ли использовать TAmazonAWS4Authentication.BuildAuthorizationString(... SignedStrHeaders из Delphi10 Berlin?

Marc Guillot
26 октября 2016 в 18:03
0

Извините, AFAI, мы не создали AccountKey, парень из Системы, создавший учетную запись, уже дал мне его. Я напишу ответ, показывающий код, который я использую.

Ответы (2)

avatar
Marc Guillot
26 октября 2016 в 18:15
2

Вот моя процедура загрузки файлов в Amazon с помощью облачных компонентов:

function UploadFile(File: TBytes; FileName: string; Bucket: string): boolean;
var Service: TAmazonStorageService;
    ConAmazon: TAmazonConnectionInfo;
begin
  try
    ConAmazon := TAmazonConnectionInfo.Create(nil);
    ConAmazon.AccountKey := 'Dih71bG09****************';
    ConAmazon.AccountName := 'AKIA***********';
    ConAmazon.QueueEndpoint := 'queue.amazonaws.com';
    ConAmazon.StorageEndpoint := 's3-eu-west-1.amazonaws.com';
    ConAmazon.TableEndpoint := 'sdb.amazonaws.com';
    ConAmazon.UseDefaultEndpoints := False;
    Service := TAmazonStorageService.Create(ConAmazon);
    Result := Service.UploadObject(Bucket, FileName, File, TRUE, nil, nil, amzbaPrivate, nil);
  finally
    ConAmazon.Free;
    Service.Free;
  end;
end;
Alexander M.
27 октября 2016 в 13:08
0

Итак, вы согласны с постоянными учетными данными и не используете временные учетные данные безопасности (токен безопасности) ... мы собираемся сделать так, чтобы безопасность нашего облачного клиента работала с токенами, и, возможно, кто-то использовал TAmazonAWS4Authentication? мы даже не видим ни одного примера от embarcadero, как с ним работать..

Marc Guillot
27 октября 2016 в 15:30
0

Да, у нас есть несколько REST-серверов Datasnap, которые единственные имеют доступ к хранилищу S3, поэтому наши ключи туда не распространяются. Вы уверены, что вам действительно нужно использовать класс TAmazonAWS4Authentication?. Я читал, что временные учетные данные безопасности работают почти так же, как постоянные учетные данные.

avatar
Alexander M.
27 октября 2016 в 21:33
1

Хорошо, наконец мы решили проблему:

1. Следует использовать Data.Cloud от Delphi10.1 Berlin. Он поддерживает стандарт безопасности Amazon AWS4. 2. TAmazonStorageService.InitHeaders следует исправить, добавив в заголовок следующий код, чтобы включить использование временных токенов сеанса:

...    
Result.Values['x-amz-security-token'] := //your session_token string; 
...

протестировал со многих сторон, теперь работает нормально :)