Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
AWS认证与Objective-C/Cocoa_Objective C_Cocoa_Amazon Web Services_Amazon S3 - Fatal编程技术网

AWS认证与Objective-C/Cocoa

AWS认证与Objective-C/Cocoa,objective-c,cocoa,amazon-web-services,amazon-s3,Objective C,Cocoa,Amazon Web Services,Amazon S3,好吧,这让我快发疯了 我正在尝试创建一个简单的AWS S3客户机,它允许与S3进行基本交互,但似乎我做错了什么,弄不清楚它是什么。这可能是显而易见的,但我没有看到 我的密钥是正确的,并且已经过测试-没有尾随空格等 问题似乎与签名有关,它不断得到“我们计算的请求签名与您提供的签名不匹配。检查亚马逊REST API中的密钥和签名方法错误。我创建了各种类别,添加了base64、HMAC SHA1生成功能,我还查看了各种在线示例,但迄今为止没有成功 不使用Amazon提供的库的原因是,它的目标是Coco

好吧,这让我快发疯了

我正在尝试创建一个简单的AWS S3客户机,它允许与S3进行基本交互,但似乎我做错了什么,弄不清楚它是什么。这可能是显而易见的,但我没有看到

我的密钥是正确的,并且已经过测试-没有尾随空格等

问题似乎与签名有关,它不断得到“我们计算的请求签名与您提供的签名不匹配。检查亚马逊REST API中的密钥和签名方法错误。我创建了各种类别,添加了base64、HMAC SHA1生成功能,我还查看了各种在线示例,但迄今为止没有成功

不使用Amazon提供的库的原因是,它的目标是Cocoa Touch,而我不想为了让它在Cocoa上发挥作用而四处闯荡

您可以在此处获取所有文件/代码的副本:

然而,我遵循亚马逊关于认证的文档,在我看来,一切都是正确的

以下是我生成签名的方式:

-(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];
#导入“S3Lite.h”
S3Lite*aws=[[S3Lite alloc]initWithAccessKey:@“”
秘钥:@“”
bucketName:@“”
地区:Kamazons3 EUWEST1地区
usesl:否];
NSData*文件=[[NSData alloc]initWithContentsOfFile:@'';
[aws putObjectWithData:路径中的文件:@“aRandomFile.png”,内容类型:nil];
如能在正确的方向上给予帮助,我们将不胜感激


S

即使您不能直接使用用于iOS的AWS SDK,它也是开源的,您可能会从这里检查请求签名代码中得到一些想法:


当请求中缺少相应的头时,您需要确保在该字符串中包含空值(例如,
Content-MD5
对于PUT请求是可选的,对于GET请求是无意义的-如果您的请求在对S3的API调用中包含该头,则只应在您要签名的字符串中包含其值).

目前,我正在开发一个基于AFNetworking 1.0的S3客户端框架(由于与较旧的操作系统兼容)。框架本身仍在开发中,但AWS4-HMAC-SHA256的所有请求签名方法都已经实现并开始工作。您可以在github上找到框架:

请随意使用它并实现您的功能,这样我们就可以一起工作了。目前,所有基本的S3请求都已实现


当然,您也可以将我的-(NSString*)AuthorizationHeaderStringForRequest:(NSMutableURLRequest*)request函数复制到您自己的代码中。AWS关于这方面的文档目前不是很好,因为它缺少创建签名密钥的一些步骤

我真的帮不上忙,因为我对S3的“协议”了解不多,但我已经看过java库JetS3t了吗?你可以试着看看他们是怎么做到的@Thibaud有限公司我看过其他各种图书馆,从我所能看到的,我的班级几乎是一样的。只是似乎找不到问题我做了一些单元测试,当我的代码通过测试时,一切都正常了。我很确定顺序是正确的?S3Lite.m的第80-96行对不起,我的错,您使用的顺序正确。我会更新我的答案。请尽可能查看第二部分,这可能是您获得与S3生成的签名不同的签名的原因。这看起来是一个方向,至少使用AmazonAuthUtils作为签名函数该链接不再工作,因为Amazon显然改变了SDK结构,但是检查他们代码的内部似乎确实有价值,因为您可以看到他们是如何编码字符串的。GitHub中的当前操作路径是aws sdk ios/AWSCore/Authentication/AWSSignature.mUpdated。谢谢你的提醒。