ErrorCode:AccessDenied,消息:AWS身份验证需要有效的Date或x-amz-date标头

时间:2013-09-21 13:33:33

标签: ios xcode amazon-web-services amazon-s3 ios7

我的应用程序在ios 6中正常工作..它从亚马逊网络服务器上传和下载数据s3 ..但是当我将ios 6升级到ios 7时...我收到了警告消息“无法连接到服务器”这个日志窗口中的错误

“Exception = AmazonServiceException {RequestId:5DC8AEF01DD9FB91,ErrorCode:AccessDenied,消息:AWS身份验证需要有效日期或x-amz-date标头}”。

解决这个问题我将我的aws ios sdk 1.0.0升级到aws ios sdk 1.6.1。并尝试运行我的应用程序冻结10-12秒然后应用程序运行。

所以请任何人告诉我解决方案我如何删除aws ios sdk 1.0.0中的“x-amz-date header”问题及其在aws ios sdk 1.6.1中的替代冻结问题..

4 个答案:

答案 0 :(得分:3)

AmazonSDKUtil.m中,我们有以下方法:

+(NSDate *)convertStringToDate:(NSString *)string usingFormat:(NSString *)dateFormat
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setDateFormat:dateFormat];
    [dateFormatter setLocale:[AmazonSDKUtil timestampLocale]];
    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];

    NSDate *parsed = [dateFormatter dateFromString:string];

    NSDate *localDate = [parsed dateByAddingTimeInterval:_clockskew];

    [dateFormatter release];

    return localDate;
}

+(NSString *)convertDateToString:(NSDate *)date usingFormat:(NSString *)dateFormat
{
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

    [dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"GMT"]];
    [dateFormatter setDateFormat:dateFormat];
    [dateFormatter setLocale:[AmazonSDKUtil timestampLocale]];

    NSDate *realDate =  [date dateByAddingTimeInterval:-1*_clockskew];

    NSString *formatted = [dateFormatter stringFromDate:realDate];

    [dateFormatter release];

    return formatted;
}

在旧版本的SDK中,区域设置和时区未正确设置为en_USGMT。这可能会导致问题,具体取决于您的设备区域设置和时区设置。最新版本的SDK修复了该问题。如果由于某种原因您无法更新SDK,则可以修改AmazonSDKUtil.m并明确设置区域设置和时区值。

修改

如果您在iOS 6和iOS 7上运行以下代码段,则可以查看区域设置如何影响日期格式。

NSDateFormatter *dateFormatter = [NSDateFormatter new];
dateFormatter.dateFormat = @"EEE, dd MMM yyyy HH:mm:ss z";
dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"PDT"];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];

NSString *dateWithoutTimezoneAndLocale = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"Date 1: %@", dateWithoutTimezoneAndLocale);

dateFormatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];

NSString *dateWithTimezoneAndLocale = [dateFormatter stringFromDate:[NSDate date]];
NSLog(@"Date 2: %@", dateWithTimezoneAndLocale);

在iOS 6上

Date 1: Wed, 25 Sep 2013 16:25:29 PDT
Date 2: Wed, 25 Sep 2013 23:25:29 GMT

在iOS 7上

Date 1: Wed, 25 Sep 2013 16:24:11 GMT-7
Date 2: Wed, 25 Sep 2013 23:24:11 GMT

如前所述,iOS {7}中NSDateFormatter的行为发生了变化;但是,此问题的根本原因是您没有明确将语言环境设置为en_US。当语言环境设置为en_US以外的其他内容时,可能会导致问题。这就是为什么我们在最新版本的SDK中明确设置区域设置,以便它在具有任何区域设置的设备上运行。

希望这是有道理的,

答案 1 :(得分:0)

我已经向Apple提交了一份错误报告(以确定这是否是一个错误)。

与此同时,我创建了一个可怕的黑客,解决了S3Request.m中的问题 方法configureURLRequest:

NSString *checkFormat =[self.date requestFormat];
if(![checkFormat hasSuffix:@":00"])
    checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];

这可能与您的AWS SDK版本不同。

我不会长期使用此修复程序 - 一旦他们回来推荐一个解决方案,我会在这里发布Apple bug报告团队的任何回复

我还在这里发了一个问题:https://forums.aws.amazon.com/thread.jspa?threadID=135829#

编辑:在最新版本的工具包中,黑客是:

NSString *checkFormat =[self.date stringWithRFC822Format];
if(![checkFormat hasSuffix:@":00"])
    checkFormat = [NSString stringWithFormat:@"%@:00",checkFormat];
[self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];

答案 2 :(得分:0)

最后我得到了解决方案,这对我有用,我使用了awsios sdk 1.3.1而不是awsios sdk 1.6.1。并在方法

中对S3Request.m进行一些更改
-(AmazonURLRequest *)configureURLRequest{
   ....
     ....

   NSString *checkFormat =[self.date stringWithRFC822Format];
   if(![checkFormat hasSuffix:@":00"])
    checkFormat = [NSString stringWithFormat:@"%@+00:00",checkFormat];
   [self.urlRequest setValue:checkFormat forHTTPHeaderField:kHttpHdrDate];
   ...
     ...

}

答案 3 :(得分:0)

我遇到了同样的问题,在更新到AWS SDK 1.6版后问题已经消失。