2017-05-03 1 views
0

Ich versuche herauszufinden, wie ein Parameter in meiner .NET-Anwendung übergeben. Die URL-Anforderung wie folgt aussieht:Amazon API generiert eine Anfrage Signatur in C#. NET

http://webservices.amazon.com/onca/xml? 
    Service=AWSECommerceService 
    &Operation=ItemLookup 
    &ResponseGroup=Large 
    &SearchIndex=All 
    &IdType=UPC 
    &ItemId=635753490879 
    &AWSAccessKeyId=[Your_AWSAccessKeyID] 
    &AssociateTag=[Your_AssociateTag] 
    &Timestamp=[YYYY-MM-DDThh:mm:ssZ] 
    &Signature=[Request_Signature] 

Der Teil, ich bin verwirrt über diese:

&Timestamp=[YYYY-MM-DDThh:mm:ssZ] 
     &Signature=[Request_Signature] 

Ich bin nicht sicher, ob ich gerade einfach, wie dies für Zeitstempel Teil etwas tun:

Also meine Frage ist, wie ich diese Signatur-URL tatsächlich in der Anfrage-URL generieren?

Ich habe alle diese Parameter oben, aber ich bin mir nicht sicher, wie man dieses letzte erzeugt?

Kann mir jemand helfen?

+0

Wer Jungs? Irgendwelche Tipps ? – User987

Antwort

4

AWS verwendet HMAC-Anforderungssignierung. Im Allgemeinen funktioniert das so, dass Sie eine "Nachricht" erstellen, die aus Dingen wie Ihrem (Ihren) Zugangsschlüssel (n), Anforderungsheadern, Anfragetext und einem Zeitstempel besteht. Sie HMAC diese "Nachricht" und das wird Ihre "Unterschrift" für die Anfrage. Dies verhindert Wiederholungsangriffe, da jede Anfrage eine eindeutige Signatur haben muss.

Es sieht so aus, als müsste der Zeitstempel einfach im ISO-Format sein (YYYY-MM-DDThh:mm:ssZ), also können Sie nicht einfach DateTime.Now verwenden. Das von ToString verwendete Standardformat ist nicht ISO.

DateTime.Now.ToString("yyyy-MM-ddThh:mm:sszzz"); 

Oder es wäre wohl tatsächlich besser zu nutzen UTC-Zeit und einfach fügen Sie ein Z: Stattdessen würden Sie so etwas wie verwenden müssen

DateTime.UtcNow.ToString("yyyy-MM-ddThh:mm:ssZ"); 

Wie für die Signatur erstellen, finden die AWS documentation, wo sie einige Beispielcode zur Verfügung stellen:

static byte[] HmacSHA256(String data, byte[] key) 
{ 
    String algorithm = "HmacSHA256"; 
    KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm); 
    kha.Key = key; 

    return kha.ComputeHash(Encoding.UTF8.GetBytes(data)); 
} 

static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName) 
{ 
    byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray()); 
    byte[] kDate = HmacSHA256(dateStamp, kSecret); 
    byte[] kRegion = HmacSHA256(regionName, kDate); 
    byte[] kService = HmacSHA256(serviceName, kRegion); 
    byte[] kSigning = HmacSHA256("aws4_request", kService); 

    return kSigning; 
} 
+0

Chris wow vielen Dank !!! Ich habe dieses Stück Code gefunden, aber ich bin immer noch verwirrt in den "RegionName" und "ServiceName" Teil für die Parameter, was muss ich in diesen Teil? – User987

+1

Das sind AWS-spezifische Dinge, aber ich glaube, sie beziehen sich auf Ihre Region, da Cloud-Services wie AWS in der Regel regionalspezifisch sind ("east-us-1"). Was immer du auch machst, was würde dort hingehen. Der Dienst ist wahrscheinlich der spezifische AWS-Dienst, an den Sie eine Anfrage stellen (z. B. 'iam') –

+0

Amazing Chriss bedankt sich sehr! Was ist mit dem in die getSignatureMethod übergebenen dateStamp, muss es im selben Format wie der Zeitstempel übergeben werden (JJJJ-MM-TTTHH: MM: SSZ)? – User987

Verwandte Themen