好吧,這讓我感到非常緊張。用Objective-C/Cocoa進行AWS身份驗證
我試圖創建一個簡單的AWS S3客戶端,將允許與S3基本交互,但似乎我做錯了什麼,不能弄清楚它是什麼。這可能是非常明顯的,但我沒有看到它。
我的密鑰是正確的,經過測試 - 無結尾的空白等
這個問題似乎是與簽名,它不斷讓我們計算出你所提供的簽名不匹配「請求籤名。檢查您的密鑰和簽名方法'來自Amazon的REST API的錯誤。我創建了各種添加base64和HMAC SHA1生成功能的類別,並且我也瀏覽了各種在線示例,但迄今尚未成功。
之所以沒有使用亞馬遜提供的庫是因爲它的目的是在可可觸摸,我不想砍左右,使其在可可工作。
你可以抓住的所有文件/此處代碼的副本:https://www.dropbox.com/s/8ts9q71dz3uopxp/S3Lite.zip
不過,我下面亞馬遜的周圍認證和我簡單的頭腦文檔,一切都被正確執行。
這裏是我是如何生成簽名:
-(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];
任何幫助正確的方向將不勝感激。
小號
我不能真正的幫助,因爲我不太瞭解S3的「協議」,但看了一下java庫JetS3t?你可以試着看看他們是如何在那裏做到的。 http://jets3t.s3.amazonaws.com/downloads.html –
@thibaultd我看過其他各種圖書館,從我所看到的,我的班級幾乎是一樣的。只是似乎無法找到問題 – SeanNieuwoudt
我做了一些基於http://docs.aws.amazon.com/AmazonS3/latest/dev/RESTAuthentication.html的單元測試,當我的代碼通過它們時,一切正常。 –