2015-09-12 7 views
6

私のiPhoneアプリからS3に署名済みのURLを使って画像をアップロードしようとしています。 AWSは無回答で終了しました。事前署名されたURLからs3にアップロードするとエラー403エラー

ステップ1:使用「signed_request」私はこの方法を使用してS3に画像をアップロードしようとしていた値が「PUT」:iPhoneは画像

{ 
    randomKey = "EJg="; 
    "signed_request" = "https://as-profile.s3.amazonaws.com/EJg%3Dios_1442061863.jpg?AWSAccessKeyId=AKIXXXXXSWPIXXXXXNXQ&Expires=1442062152&Signature=L%2BMq%2FLMXXXXXXXXzmvyGXXXXXzU%3D"; 
    url = "https://as-profile.s3.amazonaws.com/EJg%3Dios_1442061863.jpg"; 
} 

ステップ2をアップロードするS3のリンクを取得するには、サーバーにリクエストを送信

NSURL *url = [NSURL URLWithString:dict[@"signed_request"]]; 
// adding signed_request 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url]; 
[request setHTTPBody:imgData]; 
[request setValue:@"public-read" forHTTPHeaderField:@"x-amz-acl"]; 
[request setValue:@"image/jpeg" forHTTPHeaderField:@"Content-Type"]; 
[request setHTTPMethod:@"PUT"]; 

NSURLSessionDataTask *task1 = [self.session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { 

       NSError *err; 

       NSString *dataString = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 
       // 
       NSLog(@"data = %@", dataString); 

}]; 
[task1 resume]; 

//サーバーからの応答

{ status code: 403, headers { URL: https://as-profile.s3.amazonaws.com/EJg%3Dios_1442061863.jpg?AWSAccessKeyId=AKIXXXXXSWPIXXXXXNXQ&Expires=1442062152&Signature=L%2BMq%2FLMXXXXXXXXzmvyGXXXXXzU%3D } { status code: 403, headers { 
    Connection = close; 
    "Content-Type" = "application/xml"; 
    Date = "Sat, 12 Sep 2015 12:44:30 GMT"; 
    Server = AmazonS3; 
    "Transfer-Encoding" = Identity; 
    "x-amz-id-2" = "mmKNUnKaR5bA4AY/odP2iLY4JAdPkFX7kqdCEteU+Lju2py7BC909ME+Z7+QQMM0Tq64UWtlgCQ="; 
    "x-amz-request-id" = 3AE1557722FFB82F; 
} } 

は//データIを受信

<?xml version="1.0" encoding="UTF-8"?> 
<Error><Code>SignatureDoesNotMatch</Code><Message>The request signature we calculated does not match the signature you provided. Check your key and signing method.</Message><AWSAccessKeyId>AKIXXXXXSWPIXXXXXNXQ</AWSAccessKeyId><StringToSign>PUT 

image/jpeg 
1442062152 
x-amz-acl:public-read 
/as-profile/EJg%3Dios_1442061863.jpg</StringToSign><SignatureProvided>L+Mq/LM2LWlBA8TzmvyGt19AJzU=</SignatureProvided><StringToSignBytes>50 55 54 0a 0a 69 6d 61 67 65 2f 6a 70 65 67 0a 31 34 34 32 30 36 32 31 35 32 0a 78 2d 61 6d 7a 2d 61 63 6c 3a 70 75 62 6c 69 63 2d 72 65 61 64 0a 2f 61 73 2d 70 72 6f 66 69 6c 65 2f 45 4a 67 25 33 44 69 6f 73 5f 31 34 34 32 30 36 31 38 36 33 2e 6a 70 67</StringToSignBytes><RequestId>3AE1557722FFB82F</RequestId><HostId>mmKNUnKaR5bA4AY/odP2iLY4JAdPkFX7kqdCEteU+Lju2py7BC909ME+Z7+QQMM0Tq64UWtlgCQ=</HostId></Error> 
+0

私はコードをコピーして、私の最後で作業しています。 URLが機能しているかどうかを確認してください。 – ChaubeyJi

答えて

2

コードでエラーが見つかりません。ただし、応答状態としては、期待値をSignatureDoesNotMatchとしてください。秘密のパスワードはありません。秘密のクラブへのアクセスはありません。 (

  • あなたはID、署名のためのキーの右のペアを使用していることを確認し、など
  • は、キーのセットを確認し、右AWS/S3のアカウントにある:基本から始め、その後、詳細にで絞り込みます
  • これらのキーに接続されているAWSアカウントに、対象とするS3コンテナへのアクセス権があることを確認してください。
  • AWSアカウントが正しい地域にあり、リクエストがその地域に行く
  • をターゲットに設定していることを確認してください
  • 210は、エラーがプラットフォーム固有であるかどうかを確認するために、別のクライアントプラットフォーム(ブラウザ、コンソール、RESTツール)からの要求を複製してみますが、それは正しく
  • を働いていることを確認するために署名を生成するために使用している
  • Check the algorithmあなたの要求が正しく形成されていることを確認するために、common coding mistakesを探してください。 URL /空白エンコーディング、予約されたXML文字)
  • エラーが見つからなかった場合は、そのit could be a bug on Amazon's sideを除外し、バグレポートを提出するか、サポートケースを開いて検討していないAWS Troubleshooting Guide
  • に従ってください。
+0

秘密のパスワードを渡す必要がない、事前に署名されたURLについてのあなたのコメントを、URLで暗号化されるように評価してください。イメージをアップロードするだけです。私が郵便配達員に同じURLを使用すれば、それは完全である。 – Anand

+0

私のプラットフォームのバグのような音です。もう1つの "ばかげた"質問では、イメージ 'data'が実際にポピュレートされ、メソッド呼び出しとHTTPリクエストで渡されることを確認しましたか?そして、[Fiddler](http://www.telerik.com/fiddler)(またはそれに相当するもの)でリクエストを盗聴すると、電信線を介して送信されたすべてがテストリクエストと一致することがわかります。 – brichins

関連する問題