6

わかりました、これは私を狂わせています。

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

4

3 に答える 3

8

AWS SDK for iOS を直接使用できない場合でも、これはオープンソースです。以下のリクエスト署名コードを調べると、いくつかのアイデアが得られるかもしれません。

https://github.com/aws/aws-sdk-ios/blob/master/AWSCore/Authentication/AWSSignature.m

于 2013-09-30T16:06:56.543 に答える
1

現在、AFNetworking 1.0 に基づく S3 クライアント フレームワークを開発しています (古いオペレーティング システムとの互換性のため)。フレームワーク自体はまだ開発中ですが、AWS4-HMAC-SHA256 のすべてのリクエスト署名メソッドはすでに実装され、機能しています。フレームワークは github で見つけることができます: https://github.com/StudioIstanbul/SIAFAWSClient

気軽にフォークして関数を実装して、一緒に作業できるようにしてください。現在、すべての基本的な S3 リクエストが実装されています。

もちろん、私の-(NSString*)AuthorizationHeaderStringForRequest:(NSMutableURLRequest*)request関数を自分のコードにコピーすることもできます。これに関するAWSのドキュメントは、署名キーを作成するためのいくつかのステップが欠けているため、現時点ではあまり良くありません.

于 2015-09-05T10:20:18.187 に答える