2

AWS iOS SDK を使用せに Mac アプリケーションを構築しています。構築しようとしている GET リクエストは、次の一般的な形式に従う必要があります。

"Authorization: AWS " + AWSAccessKeyId + ":" + base64(hmac-sha1(VERB + "\n" + CONTENT-MD5 + "\n" + CONTENT-TYPE + "\n" + DATE + "\n" + CanonicalizedAmzHeaders + "\n" + CanonicalizedResource))

Amazon docsで「疑似構文」として提供されているとおり。私は説明を求めてあちこち探していましたが、多くの人によると、base64 ハッシュのフィールドの多くはオプションのようです。

以下は、これまでに思いついたものです。しかし、私が受け取る応答は、ヘッダーの「承認」フィールドを参照する「サポートされていない承認タイプ」という AWS からのエラーです。私はここで本当に困惑しています。これをデバッグまたは修正する方法についての洞察はありますか?

S3 の Obj C で署名済みの URL を生成する他の方法はありますか?

-(NSURLRequest*) requestWithURL: (NSString*) reqURL

{

NSMutableURLRequest *mutableRequest = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:reqURL]];
NSString* headerField = @"Authorization: ";
NSString* stringToSign = @"GET\n\n\n\n\n";

NSString* hash = [self hmacsha1:stringToSign key:SECRET_KEY];
NSString *authHeader = [NSString stringWithFormat: @"AWS%@:%@", ACCESS_KEY_ID, hash];
NSURLResponse *resp = nil;
NSError *error = nil;


[mutableRequest addValue:authHeader forHTTPHeaderField:headerField];
NSData *response = [NSURLConnection sendSynchronousRequest: mutableRequest returningResponse: &resp error: &error];
NSString *responseString = [[NSString alloc] initWithData:response encoding:NSUTF8StringEncoding];


return (NSURLRequest*) mutableRequest;

}

- (NSString *)hmacsha1:(NSString *)text key:(NSString *)secret {
    NSData *secretData = [secret dataUsingEncoding:NSUTF8StringEncoding];
    NSData *clearTextData = [text dataUsingEncoding:NSUTF8StringEncoding];
    unsigned char result[20];
    CCHmac(kCCHmacAlgSHA1, [secretData bytes], [secretData length], [clearTextData bytes], [clearTextData length], result);

    char base64Result[32];
    size_t theResultLength = 32;
    NSData *theData = [NSData dataWithBytes:base64Result length:theResultLength];
    NSString* encodedData = [NSString stringWithFormat:@"%@",[theData base64Encoding]];

    return encodedData;
}

base64 エンコーディングは、この投稿の NSData アドオンを介して行われます

4

1 に答える 1

0

クエリ文字列を認証するには、stringToSign をエンコードする必要があります。

Signature = URL-Encode( Base64( HMAC-SHA1( YourSecretAccessKeyID, UTF-8-Encoding-Of( StringToSign ) ) ) );

StringToSign = HTTP-VERB + "\n" +
        Content-MD5 + "\n" +
        Content-Type + "\n" +
        Expires + "\n" +
        CanonicalizedAmzHeaders +
        CanonicalizedResource;

ブラウザーが GET 要求を行う場合、Content-MD5 または Content-Type ヘッダーは提供されず、x-amz- ヘッダーも設定されないため、StringToSign のこれらの部分は空白のままになります。

以下に署名する必要があります

GET\n
\n
\n
1175139620\n

/johnsmith/photos/puppy.jpg

ブラウザが送信するリクエストは次のとおりです。

GET /photos/puppy.jpg?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&
    Signature=NpgCjnDzrM%2BWFzoENXmpNDUsSn8%3D&
    Expires=1175139620 HTTP/1.1

Host: johnsmith.s3.amazonaws.com

Content-Type はリクエストと stringToSign の両方から省略されますが、\nstringToSign には残ります。その他のオプションパーツも同様です。

認証の例で他の例を参照してください

詳細については、AWS ドキュメントを確認してください

于 2012-12-09T11:22:10.407 に答える