Comment puis-je mettre l'objet à amazon s3 en utilisant presigned url?
Je suis en train d'utiliser signé url de télécharger des images vers un compartiment s3. Voici mon seau politique:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::12345678:user/myuser",
"arn:aws:iam::12345678:root"
]
},
"Action": [
"s3:List*",
"s3:Put*",
"s3:Get*"
],
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
]
}
]
}
Je suis à la génération de la signature de l'url du serveur comme suit:
var aws = require('aws-sdk');
aws.config = {
accessKeyId: myAccessKeyId,
secretAccessKey: mySecretAccessKey
};
var s3 = new aws.s3();
s3.getSignedUrl('putObject', {
Bucket: 'myBucket',
Expires: 60*60,
key: 'myKey'
}, function (err, url) {
console.log(url);
});
- Je obtenir de l'url. Mais quand j'ai essayer de mettre un objet que j'obtiens l'erreur suivante:
<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>FXXXXXXXXX</RequestId>
<HostId>fXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX</HostId>
</Error>
Mise à jour de 1
Ici est myuser politique:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::2xxxxxxxxxxx:user/myuser",
"arn:aws:iam::2xxxxxxxxxxx:root"
]
},
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::myBucket",
"arn:aws:s3:::myBucket/*"
]
}
]
}
Mise à jour 2
Je peux télécharger uniquement lorsque l'option suivante est définie. Je ne comprends pas qui est l'utilisation de seau de la politique si seulement la sélection manuelle de l'autorisation de travail.
Mise à jour 3
Le code suivant fonctionne. Maintenant, le seul problème est la signature de l'url
#!/bin/bash
file="$1"
bucket="mybucket"
resource="/${bucket}/${file}"
contentType="image/png"
dateValue=`date -R`
stringToSign="PUT\n\n${contentType}\n${dateValue}\n${resource}"
s3Key="AKxxxxxxxxxxxxxxxxx"
s3Secret="/Wuxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
signature=`echo -en ${stringToSign} | openssl sha1 -hmac ${s3Secret} -binary | base64`
curl -X PUT -T "${file}" \
-H "Host: ${bucket}.s3.amazonaws.com" \
-H "Date: ${dateValue}" \
-H "Content-Type: ${contentType}" \
-H "Authorization: AWS ${s3Key}:${signature}" \
https://${bucket}.s3.amazonaws.com/${file}
- Je suppose myAccessKeyId et mySecretAccessKey appartiennent tous les deux à myuser?
- Oui, ils sont de l'utilisateur
- Vous téléchargez un fichier nommé "maclé" lorsque vous générer l'url pour "maclé", à droite?
- pas nécessairement. le fichier est renommé pour maclé après le téléchargement de s3. Le problème n'est pas le nom ici. le problème, c'est la permission. Les uploads de fichier lorsque j'ai mis la permission à tout le monde, et l'accès est refusé lorsque je n'ai pas, quel que soit mon seau d'utilisateur ou de la politique
- Je vois. Je ne pense pas que vous auriez besoin de "Principal" est l'utilisateur de la politique, il est joint à l'utilisateur de toute façon. Je vais essayer de joindre à l'utilisateur une S3 à part entière de la politique d'accès sélectionné dans la liste et essayez de télécharger un fichier avec ses clés à l'aide d'un outil comme la Chicouté d'éviter toute possibilité de surveillance avec le code ou le manuel de politiques. Une fois que vous pouvez télécharger manuellement les fichiers que je voudrais essayer le presigned url.
- ok. permettez-moi d'essayer ceux de la première et parvenir jusqu'à vous. Merci. 🙂
- Veuillez vérifier ma nouvelle mise à jour. Le final de mettre le code fonctionne. C'est pourquoi la politique est correcte. Je suis complètement ignorant ce qu'est le problème.
Vous devez vous connecter pour publier un commentaire.
J'ai réussi à réussi à télécharger un fichier à l'aide de votre code.
Voici les étapes que j'ai suivi:
Créé un nouveau seau et un nouvel utilisateur IAM
Ensemble IAM de l'utilisateur de la politique comme ci-dessous:
N'a PAS créé un seau politique
Utilisé votre code pour générer le pré-signée URL:
Copié l'URL sur l'écran et utilisé curl pour tester l'upload comme ci-dessous:
Dans mon cas, il fallait 5 à 10 secondes pour que les changements prennent effet si elle échoue la première fois, assurez-vous de garder de l'envoyer pour un certain temps.
Espère que cette aide.
getSignedUrl
fonction.La dernière page sera comme cette.
Vous pouvez également vérifier les informations d'Identification de Sécurité sous-onglet de votre accessKeyId devrait être sur la liste. Le secretAccessKey juste ne peut pas obtenir de nouveau.
Vous avez correctement défini les autorisations sur le seau, afin de permettre l'accès de l'utilisateur.
Mais vous devez également modifier la politique de l'utilisateur, afin de permettre à l'utilisateur d'accéder au service S3.
Modifier la politique IAM de l'utilisateur dont les informations d'identification que vous utilisez pour générer l'auto-signé de l'URL. Quelque chose comme ce sera certainement tout couvrir:
Il peut aussi vous aider 🙂
Ajouter un ContentType propriété :