わかりました、これは私を狂わせています。
S3 との基本的な対話を可能にする単純な AWS S3 クライアントを作成しようとしていますが、何か間違っているようで、それが何であるかを理解できません。露骨に明らかかもしれませんが、私はそれを見ていません。
私のキーは正しく、テスト済みです - 末尾の空白などはありません.
問題は署名にあるようです。「計算されたリクエストの署名が、提供された署名と一致しません。Amazon の REST API からキーと署名方法のエラーを確認してください。base64、HMAC SHA1 生成機能を追加するさまざまなカテゴリを作成し、さまざまなオンラインの例も調べましたが、これまでのところ成功していません。
Amazon が提供するライブラリを使用しない理由は、それが Cocoa Touch を対象としており、Cocoa で動作するようにハッキングしたくないためです。
ここですべてのファイル/コードのコピーを取得できます: https://www.dropbox.com/s/8ts9q71dz3uopxp/S3Lite.zip
ただし、認証に関する Amazon のドキュメントに従っています。単純な考えでは、すべてが正しく行われています。
署名を生成する方法は次のとおりです。
-(NSString *)signRequest:(NSURLRequest *)request {
NSMutableString *sig = [[NSMutableString alloc] init];
// Request Method
[sig appendFormat:@"%@\n", [request HTTPMethod]];
// Content MD5
[sig appendFormat:@"%@\n", [[request HTTPBody] MD5String]];
// Content Type
[sig appendFormat:@"%@\n", [request valueForHTTPHeaderField:@"Content-Type"]];
// Date
[sig appendFormat:@"%@\n", [request valueForHTTPHeaderField:@"Date"]];
// Canonicalized Headers
[sig appendFormat:@"%@\n", @""]; // Empty for now
// Canonicalized Resource
[sig appendFormat:@"%@", [NSString stringWithFormat:@"/%@%@", _bucket, request.URL.path]];
NSString *encodedString = [[[sig dataUsingEncoding:NSUTF8StringEncoding] hmacSHA1SignatureWithKey:_secretKey] base64String];
return [[NSString alloc] initWithFormat:@"AWS %@:%@", _accessKey, encodedString];
}
単純な PUT 要求を実行するためにそれを操作する方法は次のとおりです。
#import "S3Lite.h"
S3Lite *aws = [[S3Lite alloc] initWithAccessKey:@"<access key>"
secretKey:@"<secret key>"
bucketName:@"<bucket name>"
region:kAmazonS3EUWest1Region
useSSL:NO];
NSData *file = [[NSData alloc] initWithContentsOfFile:@"<path to a file>"];
[aws putObjectWithData:file inPath:@"aRandomFile.png" withContentType:nil];
正しい方向への助けをいただければ幸いです。
S