Télécharger s3 avec curl à l'aide de pré-signé URL (403)
J'utilise curl pour appeler en Java API ReST pour récupérer une URL. Java génère ensuite un pré-signé URL S3 charger à l'aide de mon S3 informations d'identification, et les retours que dans le Reste de la réponse. Curl prend l'URL et l'utilise pour télécharger les S3, S3 mais renvoie 403 "La demande de la signature, nous avons calculé ne correspond pas à la signature que vous avez fournis. Vérifiez votre clé et la signature de la méthode."
Voici le code que j'utilise pour générer le pré-signée URL:
public class S3Util {
static final AmazonS3 s3 = new AmazonS3Client( new AWSCredentials() {
@Override
public String getAWSAccessKeyId() {
return "XXXXXXX";
}
@Override
public String getAWSSecretKey() {
return "XXXXXXXXXXXXXX";
}
});
static final String BUCKET = "XXXXXXXXXXXXXXXXXXXXXXXXXXX";
static public URL getMediaChunkURL( MediaChunk mc, HttpMethod method ) {
String key = ...
//way in the future (for testing)...
Date expiration = new Date( System.currentTimeMillis() + CalendarUtil.ONE_MINUTE_IN_MILLISECONDS*60*1000 );
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, method);
req.setExpiration(expiration);
req.addRequestParameter("Content-Type", "application/octet-stream");
//this gets passed to the end user:
return s3.generatePresignedUrl(req);
}
}
et en curl, exécuter à partir du bash, j'exécute ceci:
echo Will try to upload chunk to ${location}
curl -i -X POST \
-F 'Content-Type=application/octet-stream' \
-F "file=@${fileName}" \
${location} || (echo upload chunk failed. ; exit 1 )
Entre autres choses, j'ai essayé de METTRE, et j'ai essayé "Content-type" (T minuscule). Je me rends compte que je suis en manque de quelque chose (ou des choses) c'est évident, mais après la lecture de l'appropriées docs, google et en regardant beaucoup de questions similaires, je ne suis pas sûr de ce qui est. Je vois beaucoup de conseils sur les en-têtes, mais je pensais que le démissionné URL était censé éliminer ces besoins. Peut-être pas?
TIA!
Mise à jour:
Juste pour être clair, j'ai testé les téléchargements, et qui fonctionne très bien.
Java ressemble:
GeneratePresignedUrlRequest req = new GeneratePresignedUrlRequest(BUCKET, key, HttpMethod.GET);
req.setExpiration(expiration);
et curl est tout simplement:
curl -i ${location}
OriginalL'auteur Bjorn Roche | 2012-01-30
Vous devez vous connecter pour publier un commentaire.
J'ai été en mesure de générer un pré-signé l'URL à l'aide de C# et de le transférer par la suite via curl comme prévu. Compte tenu de mes tests, je soupçonne que vous êtes en effet pas à l'aide de curl correctement - j'ai été en mesure de télécharger un fichier comme ceci:
Le paramètre
-v
décharges à la fois la demande et les en-têtes de réponse (ainsi que le handshake SSL) pour le débogage et à des fins d'illustration:Veuillez noter que
--upload-file
(ou-T
) facilitePUT
comme prévu, mais ajoute des en-têtes appropriés, ce qui donne une bonne réponse en retour:Pour moi, le pré-signé url figurant des personnages qui m'a obligé d'entourer l'ensemble de l'url avec des guillemets. Une fois que je l'ai fait, votre réponse a parfaitement fonctionné.
Pour moi, à l'aide de pré-signé url du POST n'a pas fonctionné. Commutation juste la méthode (à la fois dans GeneratePresignedUrlRequest et en boucle) a résolu le problème.
OriginalL'auteur Steffen Opel
quand vous faites cela avec curl, vous devez placer l'url de guillemets simples ou autre moitié de la chaîne de requête est coupée (la partie avec la touche/signature).
OriginalL'auteur handler
La façon de générer l'URL:
La façon de télécharger le fichier:
OriginalL'auteur Yuwen
Malgré le fait que
GeneratePresignedUrlRequest
accepte une méthode http d'argument (et a unsetMethod
fonction), il semble être inutilisable pour quelque chose, mais OBTENIR.http://wiki.nercomp.org/wiki/images/0/05/AmazonWebServices.pdf membres de "La pratique de la signature d'une demande et de le donner à un tiers pour l'exécution est adapté uniquement pour objet simple demande." Peut-être une autre méthode peut être utilisée pour quelque chose, mais apparemment pas.
Donc, au lieu de cela, j'ai dû suivre les instructions ici:
http://aws.amazon.com/articles/1434?_encoding=UTF8&jiveRedirect=1
C'est plus complexe, car le client est tenu d'afficher une forme complète, plutôt que de simplement en utilisant une URL, et tous les moyens que l'info du post doit être communiquée au client séparément, mais il ne semble pas fonctionner.
PUT
(malgré le côté problèmes discutés).J'ai juste confirmé que l'aide est, en effet, fonctionne très bien comme prévu par la génération d'un pré-signé URL via C# et le téléchargement par la suite, à l'aide de curl - je vais poster plus de détails, comme une réponse après une pause.
Merci pour le suivi.
je crois que le problème est dans la génération de la requête put lors de l'utilisation de java sdk, plus précisément dans la signature. Une url retournée par cette fonction peut être utilisée pour interroger le serveur, mais vous recevrez une erreur forbidden, avec une chaîne de caractères à signer octets (La demande), Si vous signez cette chaîne avec autre chose que la signature SERA différent. vous pouvez même échanger cette nouvelle signature avec celle sur la demande et la requête fonctionne. c'est peut-être un bug de java
OriginalL'auteur Bjorn Roche