Sea*_*udt 6 cocoa objective-c amazon-s3 amazon-web-services
好吧,这让我疯了.
我正在尝试创建一个简单的AWS S3客户端,它允许与S3进行基本交互,但似乎我做错了什么并且无法弄清楚它是什么.它可能很明显,但我没有看到它.
我的密钥是正确的并且已经过测试 - 没有尾随空格等.
问题似乎与签名有关,它不断得到' 我们计算的请求签名与您提供的签名不匹配.从Amazon的REST API 检查您的密钥和签名方法错误.我创建了各种类别,添加了base64,HMAC SHA1生成功能,我还查看了各种在线示例,但到目前为止还没有成功.
不使用亚马逊提供的库的原因是因为它针对的是Cocoa Touch,我不想破解它以使其适用于Cocoa.
您可以在此处获取所有文件/代码的副本: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];
}
Run Code Online (Sandbox Code Playgroud)
以下是您如何使用它来尝试执行简单的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];
Run Code Online (Sandbox Code Playgroud)
任何正确方向的帮助将不胜感激.
小号
即使您无法直接使用AWS SDK for iOS,它也是开源的,您可能会从检查请求签名代码中获得一些想法:
https://github.com/aws/aws-sdk-ios/blob/master/AWSCore/Authentication/AWSSignature.m
| 归档时间: |
|
| 查看次数: |
1490 次 |
| 最近记录: |