2017-09-01 30 views
0

私はAmazon AWSを初めて使用しており、ユーザー用の画像をアップロードするシステムをセットアップしようとしています。すべてをセットアップした後、トークンを検証できません。以下では、私が行ったすべての設定について説明します。Amazon CloudFrontとS3

IはS3バケットを作成し、私はそのバケットのCORSを構成:

<?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> 

次に、Iセットアップ本S3バケットを指すCloudFrontの分布。すべてのHTTPメソッド(「PUT」を含む)を許可するように設定されています。 S3の代わりにCloudFrontのURLでのみ画像を表示できるように、元のアクセスIDも作成されます。

私は、IAMユーザーを作成し、私はCloudFrontを介して画像をアップロードする必要があるとき、私は一時的な資格情報を要求することができるように、そのユーザーのポリシーを作成しました:今のところ

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

、私はに権限を設定しました開発のための完全なアクセス。最終的には、より厳しい権限を追加します。これが完了すると

は、私はそのようにようにAPIからの一時的な資格情報を要求します。これは、ブラウザクライアントに返され

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); 

(ノート、私は成功した三つの値を取得することができています)。これらの値を用いて

は、私がアップロードプロセスを呼び出すためにAWS-SDKを使用します。

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); 
     }); 

しかし、このすべてをやった後、エラーが返されます。

"The provided token is malformed or otherwise invalid." 

ユーザーがフル持って私が知る限り、何かが欠落していない限り、すべての設定を正しく行う必要がありますか?私はGoogleとドキュメントの検索後にどこでも解決策を見つけることができない、私は完全にここで立ち往生している。

EDIT:実際に外出するリクエストの詳細です。 Googleのブラウザ開発ツールによって提供されるこれらは、リクエストヘッダです:あなたは、一時的なセキュリティ証明書を配るために、SQSキューサービスを使用する必要があるよう

: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

*ここでは有効ではありません。ここでは2つの異なる概念を混在させています。 CloudFrontから送信されたリクエストを承認するには、別のアルゴリズムを使用するCloudFrontの署名付きURLが必要です。 CloudFront URLは、バケットポリシーごとに、オリジンアクセスIDが実行できるすべてのメソッドに対して有効であるため、問題があります。 –

+0

情報をありがとう。これと一緒に行くための示唆された方法は何でしょうか?私は実際に操作を取得する必要はありませんが、追加と削除のために私はこれを確保したいと思います。私はCloudFront経由ですべての操作を行いたいと思います。私は先に進むことができ、S3で直接追加や削除を行い、CloudFrontを取得し、私がしようとしていることを達成する方法がない限り、ユーザーがS3とCloudFront URLでオブジェクトにアクセスできるという事実を生きている行う? – Stalfos

+0

私はいくつかの利用可能なオプションについて完全な説明をしています。 CloudFrontを使用してすべての操作を行う理由を明確にすることはできますか?このアプローチには何も問題はありません。いくつかの利点がありますが、CloudFrontを介したアップロードはキャッシュとやりとりすると想定していますが、そうではないと仮定している人もいます。また、バケツとユーザーの価格クラスの選択と配置によって、S3 Transfer Accelerationがアップロードのためのより良い選択になるかもしれません。これは、CloudFront(CloudFrontネットワークを使用)によるアップロードとまったく同じ技術ですが、潜在的により有利な価格設定モデルです。あなたの考え? –

答えて

-1

が見えます。以下を参照してください。 Temporary Security Credentials

+0

SQSは一時的なセキュリティ資格情報を渡しません。これは単純なキューサービスの奇妙な機能です。 STSサービスはそれらを手渡す。 http://docs.aws.amazon.com/STS/latest/APIReference/Welcome.htmlリンクした記事では、STSの資格情報を使用してSQSサービスにアクセスする方法について説明しています。 –

関連する問題