7

C# 経由で REST API を使用して、S3 からファイルをフェッチするコードを動作させようとしています。他の人が同様のことをしているのを見たことがありますが、何らかの理由で 403 エラーが発生し続けます。私はAWS SDK for .Netで同じことをしようとしましたが、うまくいくので、認証ヘッダーを作成している方法だと思います。

誰でもこれに光を当てることができますか?

string awsAccessId = "***";
string awsSecretKey = "***";
string bucketName = "thebucket";

string httpDate = DateTime.Now.ToString("ddd, dd MMM yyyy HH:mm:ss +0000\n");
                string canonicalString = "GET\n"
                                        + "\n"
                                        + "\n"
                                        + "x-amz-date:" + httpDate + "\n"
                                        + "/" + bucketName + "/readme.txt";

                // now encode the canonical string
                Encoding ae = new UTF8Encoding();
                // create a hashing object
                HMACSHA1 signature = new HMACSHA1();
                // secretId is the hash key
                signature.Key = ae.GetBytes(awsSecretKey);
                byte[] bytes = ae.GetBytes(canonicalString);
                byte[] moreBytes = signature.ComputeHash(bytes);
                // convert the hash byte array into a base64 encoding
                string encodedCanonical = Convert.ToBase64String(moreBytes);

                // Send the request
                HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create("http://" + bucketName +".s3.amazonaws.com/readme.txt");
                request.Headers.Add("x-amz-date", httpDate);
                request.Headers.Add("Authorization", "AWS " + awsAccessId + ":" + encodedCanonical);
                request.Method = "GET";

                // Get the response
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                Console.WriteLine(response.StatusCode);
                Console.Read();
4

2 に答える 2

3

私はあなたのコードをテストしました、それは動作します! 追加の \n と http を https に変更するだけで完了です。

 string stringToConvert = "GET\n"
                          + "\n"
                          + "\n"
                          + "\n"
                          + "x-amz-date:" + timeStamp + "\n"  
                          + "/" + bucketName + "/" + FileName;

Amazon Rest API には適切なドキュメントがありません。例がないため、誰もが代わりに SDK に行きます。

于 2014-10-02T18:48:58.360 に答える
2

これが唯一の問題かどうかはわかりませんが、明確な問題のように見えます。

+ "x-amz-date:" + httpDate + "\n"

x-amz-dateは、HTTP リクエスト自体の Date: ヘッダーに取って代わるヘッダーですが、署名する文字列では、例に従って、「x-amz-date:」またはその前に何かを付けずに日付を入れるだけです。

GET\n
\n
\n
Tue, 27 Mar 2007 19:36:42 +0000\n
/johnsmith/photos/puppy.jpg

http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html#RESTAuthenticationRequestCanonicalization

要求に対して生成できる正しい署名は 1 つだけです。S3 はその署名を生成し、送信したものと比較するため、署名する文字列に 1 バイトのエラーの余地はありません。

于 2013-10-31T01:03:46.083 に答える