2015-07-20 10 views
10

Sto tentando di inviare una richiesta PUT a un URL predefinito amazonS3. La mia richiesta sembra essere chiamata due volte anche se ho solo una richiesta PUT. La prima richiesta restituisce 200 OK, la seconda restituisce 400 Bad Request.È consentito un solo meccanismo di autenticazione; solo il parametro di query X-Amz-Algorithm ..?

Ecco il mio codice:

var req = { 
    method: 'PUT', 
    url: presignedUrl, 
    headers: { 
     'Content-Type': 'text/csv' 
    }, 
    data: <some file in base64 format> 
}; 

$http(req).success(function(result) { 
    console.log('SUCCESS!'); 
}).error(function(error) { 
    console.log('FAILED!', error); 
}); 

L'errore 400 Bad Request più in dettaglio:

<?xml version="1.0" encoding="UTF-8"?> 
<Error> 
    <Code>InvalidArgument</Code> 
    <Message>Only one auth mechanism allowed; only the X-Amz-Algorithm query parameter, Signature query string parameter or the Authorization header should be specified</Message> 
    <ArgumentName>Authorization</ArgumentName> 
    <ArgumentValue>Bearer someToken</ArgumentValue> 
    <RequestId>someRequestId</RequestId> 
    <HostId>someHostId</HostId> 
</Error> 

Quello che non capisco è, perché è tornando 400? e qual è la soluzione?

+0

Vorrei indagare sul motivo per cui è chiamato due volte, dal momento che il primo sembra funzionare OK –

+0

Hai trovato qualche soluzione? – Hemang

+2

Se vuoi chiamare s3 url, rimuovi le intestazioni di autorizzazione che hai utilizzato per qualsiasi altra API nella tua app prima di chiamarla. –

risposta

12

Il client sta probabilmente inviando una richiesta iniziale che utilizza un'intestazione Autorizzazione, a cui viene risposto un 302. La risposta include un'intestazione di posizione con un parametro Firma. Il problema è che le intestazioni della richiesta iniziale vengono copiate nella richiesta di reindirizzamento successiva, in modo tale che contenga sia l'autorizzazione che la firma. Se rimuovi l'autorizzazione dalla richiesta successiva, dovresti essere bravo.

Questo è successo a me, ma in un ambiente Java/HttpClient. Posso fornire i dettagli della soluzione in Java, ma sfortunatamente non per AngularJS.

+0

Se riesci a incollare i dettagli della tua soluzione in Java sarà fantastico ... ti sei imbattuto nello stesso problema. – velval

+0

Sfortunatamente il codice è stato sostituito con un modo alternativo di accedere a S3 (trasmesso attraverso il server dell'app anziché direttamente), quindi non ce l'ho più. In pratica, si accede alle intestazioni di risposta e si rimuove l'autorizzazione prima di applicarle alla richiesta successiva. – mlohbihler

+2

Questo è stato molto utile. Sto ottenendo lo stesso problema in postino. C'è un modo per risolverlo – arjuncc

0

So che potrebbe essere troppo tardi per rispondere, ma come ha detto @mlohbihler, la causa di questo errore per me è stata l'intestazione dell'autorizzazione inviata dall'intercettore http che avevo impostato in Angular. In sostanza, non avevo filtrato correttamente il dominio AWS S3 in modo da evitare che ottenesse automaticamente l'intestazione dell'autorizzazione JWT.

0

Inoltre, il 400 "argomento non valido" può essere visualizzato come risultato di config/credenziali errate per S3 :: Presegnante che presegna l'url per iniziare. Una volta superato il 400, è possibile che si verifichi una risposta 501 "non implementata" come ho fatto io. È stato in grado di risolverlo specificando un'intestazione Content-Length (specificata here come intestazione obbligatoria). Spero che questo aiuti @arjuncc, ha risolto il mio problema post-post durante il test di upload di immagini s3 con un URL preselezionato.

Problemi correlati