2016-07-20 18 views
0

Ich versuche, eine PUT-Anfrage auf einen Amazon-kompatiblen Speicher zu senden, und ich immer die folgende Fehlermeldung erhalten:Signature Generation in Amazon S3 mit Javascript

"<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your Secret Access Key and signing method. For more information, see REST Authentication and SOAP Authentication for details.</Message><RequestId>0af9f985:155f11613d1:1732:13</RequestId></Error>" 

Kann jemand bitte sagen Sie mir, wie man die richtige Signatur zu erzeugen Verwenden des geheimen Zugriffsschlüssels und anderer Parameter in Javascript. Ich weiß, dass ich die richtigen Anmeldeinformationen verwende, da alle anderen von Amazon S3 unterstützten Vorgänge mit dem Amazon S3 SDK funktionieren. Ich ging durch diesen Link: http://docs.aws.amazon.com/general/latest/gr/signature-v4-examples.html, aber ich konnte nicht finden, was die Methode für jeden Parameter erwartet.

Hinzufügen des Codes, den ich geschrieben habe. Das ist so ziemlich das gleiche wie Sie in der Javascript-SDK, nur die Methode canonicalizedResource, ist einfacher:

private stringToSign(request: any) { 
     var parts = []; 
     parts.push(request.headers['method']); 
     parts.push(request.headers['Content-MD5'] || ''); 
     parts.push(request.headers['Content-Type'] || ''); 
     parts.push(request.headers['presigned-expires'] || ''); 

     var headers = this.canonicalizedAmzHeaders(request); 
     if (headers) parts.push(headers); 
     parts.push(this.canonicalizedResource(request)); 
     return parts.join('\n');; 
    } 

    private canonicalizedAmzHeaders(request: any) { 
     var amzHeaders = []; 
     AWS.util.each(request.headers, function(name) { 
      if (name.match(/^x-amz-/i)) 
       amzHeaders.push(name); 
     }); 
     amzHeaders.sort(function(a, b) { 
      return a.toLowerCase() < b.toLowerCase() ? -1 : 1; 
     }); 
     var parts = []; 
     AWS.util.each(amzHeaders, function(name) { 
      parts.push(amzHeaders[name].toLowerCase() + ':' + request.headers[amzHeaders[name]]); 
     }); 
     return parts.join('\n'); 
    } 

    private canonicalizedResource(request) { 

     return request.path || '/'; 
    } 

ich die Methode nennen wie:

var signature = this.sign(AWS.config.credentials.secretAccessKey, this.stringToSign(request)); 
+0

Können Sie auch den Code einfügen, den Sie zum Generieren der Signatur verwenden? – error2007s

+0

Den Code finden Sie in der Fragebeschreibung. -Vielen Dank. – UnderWood

+0

"ein Amazon-kompatibler Speicher?" Nicht wirklich S3? Der Signature-Version-4-Algorithmus verfügt über eine [Testsuite] (http://docs.aws.amazon.com/general/latest/gr/signature-v4-test-suite.html), die Ihnen nicht nur Musteranmeldeinformationen und Anforderungen bereitstellt und Ergebnisse, aber auch Zwischenwerte, um die Fehlersuche zu optimieren, damit Sie leichter erkennen können, was mit Ihrem Code nicht stimmt. –

Antwort

0

Können Sie Ihre Systemzeit stellen Sie sicher, ist aktuell? Ich hatte Probleme, wenn meine Systemzeit nicht synchron ist. AWS lehnt diese API-Aufrufe ab.