2017-09-01 7 views
0

Je suis nouveau sur Amazon AWS et j'essaie de configurer un système pour télécharger des images pour les utilisateurs. Après avoir tout configuré, je suis incapable de valider un jeton. Ci-dessous, je vais vous expliquer toute la configuration que j'ai faite.Amazon CloudFront et S3

J'ai créé un seau S3 et je configuré CORS pour ce seau:

<?xml version="1.0" encoding="UTF-8"?> 
<CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> 
<CORSRule> 
    <AllowedOrigin>*</AllowedOrigin> 
    <AllowedMethod>GET</AllowedMethod> 
    <AllowedMethod>POST</AllowedMethod> 
    <AllowedMethod>PUT</AllowedMethod> 
    <AllowedMethod>DELETE</AllowedMethod> 
    <AllowedMethod>HEAD</AllowedMethod> 
    <MaxAgeSeconds>3000</MaxAgeSeconds> 
    <AllowedHeader>*</AllowedHeader> 
</CORSRule> 
</CORSConfiguration> 

Ensuite, je configurer une distribution CloudFront qui pointe vers ce seau S3. Il est configuré pour autoriser toutes les méthodes HTTP (y compris "PUT"). Une identité d'accès d'origine est également créée afin que les images ne soient visibles que par l'URL CloudFront, au lieu de S3.

J'ai ensuite créé un utilisateur IAM et ont créé une politique pour cet utilisateur afin que je puisse demander les informations d'identification temporaires quand j'ai besoin de télécharger une image via CloudFront:

{ 
    "Version": "2012-10-17", 
    "Statement": [ 
     { 
      "Sid": "Stmt1504225496000", 
      "Effect": "Allow", 
      "Action": [ 
       "s3:*" 
      ], 
      "Resource": [ 
       "*" 
      ] 
     } 
    ] 
} 

Pour l'instant, je mets les autorisations accès complet juste pour le développement. Finalement, je vais ajouter des autorisations plus strictes.

Une fois cette opération terminée, je demande alors des informations d'identification temporaire d'une API comme ceci:

var securityClient = 
       new AmazonSecurityTokenServiceClient(Variables.AWSUserWriteId, Variables.AWSUserWriteKey); 

      var request = new GetSessionTokenRequest 
      { 
       DurationSeconds = 900 
      }; 

      var tempCredentials = await securityClient.GetSessionTokenAsync(request); 
      return new ApiResponse(Enums.ResponseStatus.Success, new JObject 
      { 
       {"id", tempCredentials.Credentials.AccessKeyId}, 
       {"key", tempCredentials.Credentials.SecretAccessKey}, 
       {"token", tempCredentials.Credentials.SessionToken} 
      }, null); 

Ceci est retourné au client du navigateur (note, je suis en mesure d'obtenir avec succès les trois valeurs).

En utilisant ces valeurs, j'utiliser AWS SDK pour appeler le processus de téléchargement:

let id = response.data.JsonData.id; 
     let key = response.data.JsonData.key; 
     let token = response.data.JsonData.token; 

     let s3 = new AWS.S3({ 
      accessKeyId: id, 
      secretAccessKey: key, 
      sessionToken: token, 
      endpoint: cloudFrontUrl //https://d3goqf5vihdmh2.cloudfront.net 
     }); 
     s3.upload({Body: file, Bucket: amazonS3BucketName, Key: file.name}, (err, data) => { 
      console.log(err); 
      console.log(data); 
      let hello = "hello"; 
     }).on("httpUploadProgress", evt => { 
      console.log(evt); 
     }); 

Cependant, après avoir fait tout cela, une erreur est renvoyée:

"The provided token is malformed or otherwise invalid." 

L'utilisateur a plein autorisations, et autant que je peux dire, je devrais avoir tout configuré correctement, à moins que je manque quelque chose? Je ne trouve pas de solution après une recherche sur google et de la documentation, je suis complètement coincé ici.

EDIT: Voici plus d'informations sur les demandes qui sortent réellement. Ce sont les têtes de requête fournis par Google Browser Dev Tools:

:authority:d3goqf5vihdmh2.cloudfront.net 
:method:PUT 
:path:/**removingforprivacy**.development/**removingforprivacy**.png 
:scheme:https 
accept:*/* 
accept-encoding:gzip, deflate, br 
accept-language:en-US,en;q=0.8 
authorization:AWS4-HMAC-SHA256 Credential=**removingforprivacy**/20170901/us-east-1/s3/aws4_request, SignedHeaders=host;x-amz-content-sha256;x-amz-date;x- 
amz-security-token;x-amz-user-agent, 
Signature=180d55d69eb0577b77d14b8938c675cbd8798924132c7367d02fbd59b5e8a3d3 
content-length:33041 
content-type:application/octet-stream 
origin:http://localhost:3000 
referer:http://localhost:3000/postnew 
user-agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.113 Safari/537.36 
x-amz-content-sha256:UNSIGNED-PAYLOAD 
x-amz-date:20170901T024531Z 
x-amz-security-token:FQoDYXdzEMz//////////wEaDDJE64k3fztWLnZWJiKrAbIUNroRDzBfHcFJrPTUIgNSKFWdZDM4Nt0a7UCxwnWopLRDJAMiwt/gX1svqe5ZJsUL+yHTubJylLVvIIZdxsGGCeSZhmaquyd5jWsx9n+PeHB5MFbxkcDdRWhaQ8eXobABH0Q53xxH/zBXxIZTn/qEERgHPjfaPVLLmzQmbd6+toc/WQX5y3HZMvf7ZgTh3KdoHWDwJEmCeYx6NuyNpR9NIiubVvI/2gH8zijGk6PNBQ== 
x-amz-user-agent:aws-sdk-js/2.107.0 callback 
+0

* 'endpoint: cloudFrontUrl' * n'est pas valide, ici ... Vous mélangez deux concepts différents. Pour autoriser une demande envoyée via CloudFront, vous devez disposer d'une URL signée CloudFront, qui utilise un algorithme différent. Ceci est à son tour problématique car une URL CloudFront est valide pour toute méthode que l'identité d'accès d'origine peut effectuer, conformément à la stratégie de compartiment. –

+0

Merci pour l'information. Quel serait le moyen suggéré d'aller avec cela? Je n'ai pas vraiment besoin de sécuriser les opérations, mais pour ajouter et supprimer je voudrais sécuriser cela et je voudrais faire toutes les opérations via CloudFront. Je suppose que je peux aller de l'avant et faire les ajouts et suppressions directement sur S3, et obtient sur CloudFront et vivre avec le fait qu'un utilisateur peut accéder aux objets par S3 et CloudFront URLs, à moins qu'il y ait un moyen d'atteindre ce que j'essaie faire? – Stalfos

+0

Je travaille une explication complète avec certaines des options disponibles. Pouvez-vous clarifier pourquoi vous voulez faire toutes les opérations via CloudFront? Il n'y a rien de mal à cette approche, et cela présente certains avantages, mais certaines personnes supposent que les téléchargements via CloudFront interagissent avec le cache, mais ce n'est pas le cas.En outre, la sélection de votre classe de prix et l'emplacement des compartiments et des utilisateurs peuvent faire de l'accélération de transfert S3 un meilleur choix pour les téléchargements. C'est exactement la même technologie que les téléchargements via CloudFront (il utilise le réseau CloudFront), mais un modèle de tarification potentiellement plus favorable. Tes pensées? –

Répondre

-1

On dirait que vous avez besoin d'utiliser le service de file d'attente SQS afin de distribuer des informations d'identification de sécurité temporaire. Voir ce qui suit ici Utilisation de Temporary Security Credentials

+0

SQS ne distribue pas d'informations d'identification de sécurité temporaires. Ce serait une caractéristique étrange d'un simple service de file d'attente. Le service STS les distribue. http://docs.aws.amazon.com/STS/latest/APIReference/Welcome.html L'article que vous avez lié traite de l'utilisation des informations d'identification de STS pour accéder au service SQS. –