2016-10-28 1 views
0

présignée Je suis très nouveau pour AWS, et je suis en train de permettre aux utilisateurs d'accéder à/télécharger des photos sur S3 avec des URL pré-signé.récupérer ou objets sur Amazon S3 avec l'URL

Voici mon code:

const getLinkForKey = key => new Promise((resolve, reject) => { 
 
    const params = {Bucket: PICTURES_BUCKET, Key: key}; 
 
    S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url)); 
 
});

Je reçois une URL de cela, mais lorsque je tente d'accéder au lien que je l'ai reçu, je reçois une exception d'accès refusé .

Je pense que je dois peut-être configurer une politique de seau ou quelque chose comme ça, mais je suis vraiment confus à ce sujet.

Savez-vous comment faire ce travail?

Merci,

+0

Dans les autorisations de compartiment, autorisez 'Everyone' à pouvoir lister/afficher les fichiers. – hjpotter92

+0

Si je le fais, tout le monde pourra accéder à ces photos, n'est-ce pas? Je voudrais donner un lien spécifique à des personnes spécifiques pour qu'elles puissent accéder à une image spécifique – Ereold

+0

Si vous connaissez leurs adresses IP, vous pouvez créer une politique. – hjpotter92

Répondre

1

Oui, l'URL pré-signé devrait travailler pour vous. Il suffit de fournir une explication rapide ...

Par défaut, tous les objets dans Amazon S3 sont privés. Vous pouvez ensuite ajouter des autorisations pour que les utilisateurs puissent accéder à vos objets. Cela peut se faire via:

  • autorisations de liste de contrôle d'accès sur les objets individuels
  • Une politique Bucket (qui donne accès à large allant basé sur le chemin, l'adresse IP, referrer, etc.)
  • utilisateurs IAM et des groupes (que les autorisations de subvention pour les utilisateurs avec des informations d'identification AWS)
  • URL présignée

A Pre-Signed URL peut être utilisé pour accorder l'accès à S3 obje cts comme un moyen de "passer outre" les contrôles d'accès. Un objet normalement privé est accessible via une URL par en ajoutant une date d'expiration et une signature. C'est un excellent moyen de servir du contenu privé sans avoir besoin d'un serveur web.

Si votre objectif est de servir le contenu que si une URL présignée est utilisée, alors:

  • Ne pas attribuer les autorisations via les méthodes normales énumérées ci-dessus (ce qui les garde privés par défaut)
  • Utilisez URL présignée d'accéder aux objets

Votre code est:

const getLinkForKey = key => new Promise((resolve, reject) => { 
    const params = {Bucket: PICTURES_BUCKET, Key: key}; 
    S3.getSignedUrl('getObject', params, (err, url) => err && reject(err) || resolve(url)); 
}); 

Je remarque que vous êtes ne transmettant pas le paramètre Expires, qui spécifie la période de validité de l'URL pré-signée. Voici un exemple de code de la Amazon S3 documentation for node.js:

var params = {Bucket: 'bucket', Key: 'key', Expires: 60}; 
var url = s3.getSignedUrl('getObject', params); 
console.log('The URL is', url); // expires in 60 seconds 

Par conséquent, il est tout à fait possible que le lien a expiré avant l'URL testé.Je vous recommande de fournir un paramètre Expires et de le régler à une longueur adaptée à votre usage prévu (par exemple 300 secondes).

+0

Sur la documentation, il est dit que par défaut, le Expires est défini pour 15 minutes. J'ai encore essayé de le configurer manuellement et le résultat est le même, Accès refusé: -/ – Ereold

+1

Vérifiez que vous n'avez pas une autre politique qui remplace la sécurité (bien que je ne suis pas sûr que cela s'appliquerait avec des URL pré-signées). Par exemple: La stratégie de compartiment doit probablement être vide, les autorisations IAM pour l'utilisateur de signature ne doivent pas avoir de DENY. Vous pouvez également tester la création d'URL prédéfinies via la commande [AWS Command-Line Interface (CLI)] (http://aws.amazon.com/cli/) ['aws s3 presign'] (http: // docs.aws.amazon.com/cli/latest/reference/s3/presign.html). –

+0

est-il possible que nous puissions générer ces URL prédéfinies à partir de la console? –

0

J'ai finalement découvert où le problème était. J'exécutais mon code dans un lambda qui n'avait pas un accès correct à S3 configuré. Malheureusement, il n'y avait pas d'erreur pour m'aider à trouver cela. Il est maintenant corrigé et les liens fonctionnent :)