Iphone 通过objective-c从azure表生成身份验证标头

Iphone 通过objective-c从azure表生成身份验证标头,iphone,objective-c,azure,icloud,Iphone,Objective C,Azure,Icloud,我正在从iCloud获取数据,为此我需要生成一个标头(azure表存储) 我使用了下面的代码,它正在生成标题。但是,当我在项目中使用这些头时,它会显示“确保授权头的值的格式正确,包括签名。” 我在谷歌上搜索了很多,尝试了很多代码,但都没有成功 有谁能帮我找出这段代码中的错误吗 -(id)generat { NSString *messageToSign = [NSString stringWithFormat:@"%@/%@/%@", dateString,AZURE_ACCOUNT_N

我正在从iCloud获取数据,为此我需要生成一个标头(azure表存储)

我使用了下面的代码,它正在生成标题。但是,当我在项目中使用这些头时,它会显示“确保授权头的值的格式正确,包括签名。”

我在谷歌上搜索了很多,尝试了很多代码,但都没有成功

有谁能帮我找出这段代码中的错误吗

-(id)generat
{
    NSString *messageToSign = [NSString stringWithFormat:@"%@/%@/%@", dateString,AZURE_ACCOUNT_NAME, tableName];

    NSString *key = @"asasasasasasasasasasasasasasasasasasasasas==";

    const char *cKey = [key cStringUsingEncoding:NSUTF8StringEncoding];

    const char *cData = [messageToSign cStringUsingEncoding:NSUTF8StringEncoding];

    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];

    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);

    NSData *HMAC = [[NSData alloc] initWithBytes:cHMAC length:sizeof(cHMAC)];

    NSString *hash = [Base64 encode:HMAC];

    NSLog(@"Encoded hash: %@", hash);

    NSURL *url=[NSURL URLWithString: @"http://my url"];

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url];

    [request addValue:[NSString stringWithFormat:@"SharedKeyLite %@:%@",AZURE_ACCOUNT_NAME, hash] forHTTPHeaderField:@"Authorization"];

    [request addValue:dateString forHTTPHeaderField:@"x-ms-date"];

    [request addValue:@"application/atom+xml, application/xml"forHTTPHeaderField:@"Accept"];

    [request addValue:@"UTF-8" forHTTPHeaderField:@"Accept-Charset"];

    NSLog(@"Headers: %@", [request allHTTPHeaderFields]);

    NSLog(@"URL: %@", [[request URL] absoluteString]);
     return request; 
}

-(NSString*)rfc1123String:(NSDate *)date
{
    static NSDateFormatter *df = nil;
    if(df == nil)
    {
        df = [[NSDateFormatter alloc] init];
        df.locale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
        df.timeZone = [NSTimeZone timeZoneWithAbbreviation:@"GMT"];
        df.dateFormat = @"EEE',' dd MMM yyyy HH':'mm':'ss 'GMT'";
    }
    return [df stringFromDate:date];
}

看起来您可能错过了一条新行:

NSString *messageToSign = [NSString stringWithFormat:@"%@/%@/%@", dateString,AZURE_ACCOUNT_NAME, tableName];
我不知道Objective-C,但我希望格式是
@“%@\n/%@/%@/%@”
(如果在这种编程语言中字符串文本中的换行符就是这样工作的)

此外,我认为您需要以下两个标题:

DataServiceVersion:1.0;NetFx
MaxDataServiceVersion:1.0;NetFx
编辑:我想到这些头可能出现在代码的另一部分中。您可能还需要
x-ms-version
标题(也可能出现在代码的其他地方)/EDIT


出于良心,我不能不指出将存储密钥放在客户端(如手机)上是个坏主意。任何获得你的应用程序的人都可以提取密钥并使用它删除你的所有数据、上传他们的私人DVD收藏等。你的存储密钥是机密,因此不应分发给客户端。

@meccan no.im没有使用ARC。你知道我的代码中有什么错误。好吧,那么你泄漏了“HMAC”和“df” object@meccan没关系。我现在正在做一个样本项目。