Also, ich habe das ganze jetzt mal versucht umzusetzen. Der Request sieht soweit in Ordnung aus, trotzdem kommt ein "401 Unauthorized". Evtl. sieht jemand meinen Fehler oder kann mir helfen ihn zu lösen. Ich fürchte, dass die Signatur falsch berechnet wird und es ein
Unicode/
Ansi-Problem ist, komme aber seit Stunden nicht weiter
Delphi-Quellcode:
TAmazonAuth = class(TSoapHeader)
private
FAWSAccessKeyId: string;
FTimestamp: string;
FSignature: string;
published
property AWSAccessKeyId: string (* index (IS_REF) *) Read FAWSAccessKeyId Write FAWSAccessKeyId;
property Timestamp: string Read FTimestamp Write FTimestamp;
property Signature: string Read FSignature Write FSignature;
end;
implementation
function emt_now: TDateTime;
var
st: TSystemTime;
begin
GetSystemTime(st);
Result := SystemTimeToDateTime(st);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
Headers: ISOAPHeaders;
Hdr: TAmazonAuth;
ctx: THMAC_Context;
mac: THashDigest;
phash: PHashDesc;
AmazonString, AmazonTimestamp, AmazonSignature: ansistring;
AWSPort: AWSECommerceServicePortType;
body: ItemSearch;
arr_request: Array_Of_ItemSearchRequest;
aRequest: ItemSearchRequest;
aResponse: ItemSearchResponse;
i: integer;
j: integer;
begin
AWSPort := GetAWSECommerceServicePortType(False, '', RIO);
RemClassRegistry.RegisterXSClass(TAmazonAuth, 'http://security.amazonaws.com/doc/2007-01-01/', 'TAmazonAuth');
InvRegistry.RegisterHeaderClass(TypeInfo(AWSECommerceServicePortType), TAmazonAuth, 'Header', 'http://security.amazonaws.com/doc/2007-01-01/'); {and the header}
Headers := RIO as ISOAPHeaders;
Hdr := TAmazonAuth.Create;
//Authentication
AmazonTimestamp := FormatDateTime('yyyy"-"mm"-"dd"T"hh":"nn":"ss"Z"', emt_now);
AmazonString := 'ItemSearch' + AmazonTimestamp;
// Generate Request and Signature - Build Signature
phash := FindHash_by_Name('SHA256');
hmac_inits(ctx, phash, sAWSID);
hmac_update(ctx, @AmazonString[1], Length(AmazonString));
hmac_final(ctx, mac);
AmazonSignature := Base64Str(@mac[1], sizeof(TSHA256Digest));
Hdr.FSerializationOptions := [xoHolderClass, xoAttributeOnLastMember, xoSimpleTypeWrapper];
Hdr.FAWSAccessKeyId := AWSID;
Hdr.FTimestamp := AmazonTimestamp;
Hdr.FSignature := AmazonSignature;
Headers.Send(Hdr);
body := ItemSearch.Create;
body.AWSAccessKeyId := AWSID;
aRequest := ItemSearchrequest.Create;
aRequest.SearchIndex := 'Video';
aRequest.Title := 'Matrix';
SetLength(arr_request, 1);
arr_request[0] := aRequest;
body.Request := arr_request;
aResponse := AWSPort.ItemSearch(body);
for i := 0 to Length(aResponse.Items) - 1 do
for j := 0 to Length(aResponse.Items[i].Item) - 1 do
begin
LiveLog.Lines.Add(aResponse.Items[i].Item[j].ItemAttributes.Title);
end;
end;
LiveLog ist ein einfaches Memo in dem die Ergebnisse stehen sollen. Die Konstanten für die Schlüssel muss man natürlich noch ändern:
Delphi-Quellcode:
const
AWSID = 'Die AWS ID';
sAWSID = 'Die geheime AWS ID';