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 アドオンを介して行われます