Как отформатировать запрос хранения таблицы Azure с iphone в Object-c - PullRequest
1 голос
/ 05 ноября 2010

Мне нужна помощь, чтобы исправить заголовки для запроса хранения таблицы Azure из приложения для iPhone. Я использовал эти два сообщения, чтобы попытаться получить правильное шифрование ключа, но у меня все еще проблемы: кодировка iPhone и HMAC-SHA-1 Пример кода Objective C для HMAC-SHA1 Служба возвращает ошибку по моему запросу: Серверу не удалось аутентифицировать запрос с этой ошибкой:

Make sure the value of Authorization header is formed correctly including the signature.

Я использую следующий код для запроса:

NSDate *now = [[NSDate alloc] init];
    NSString *dateString = [self rfc1123String:now];

    NSString *messageToSign = [NSString stringWithFormat:@"%@\n/%@/%@", dateString, AZURE_ACCOUNT_NAME, table];

    [Base64 initialize];
    //xxx in my code is my primary access shared key
    NSString *key = @"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";

    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);

    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;

Что приводит к созданию этих заголовков для запроса:

Accept = "application/atom+xml, application/xml";
    "Accept-Charset" = "UTF-8";
    Authorization = "SharedKeyLite powderdayalarm:xwT1purDtREtxauVr6Bhvdz/2ObLh2J0lMw/prBBQBE=";
    "X-Ms-Date" = "Fri, 05 Nov 2010 18:26:00 GMT";

Спецификация для запроса здесь: http://msdn.microsoft.com/en-us/library/dd179428.aspx Что относится к следующему:

Этот формат поддерживает общий ключ и Общий ключ Lite для всех версий Табличный сервис и Shared Key Lite для 2009-09-19 версии Blob и очереди услуг. Этот формат идентичен используемому с предыдущим версии сервисов хранения. Построить CanonicalizedResource строка в этом формате выглядит следующим образом:

  1. Начиная с пустой строки (""), добавьте косую черту (/), сопровождается именем учетной записи которому принадлежит доступ к ресурсу.

  2. Добавить кодированный путь ресурса URI. Если адрес запроса URI компонент ресурса, добавить соответствующая строка запроса. Строка запроса должна включать знак вопроса и параметр комп (например,? comp = метаданные). нет другие параметры должны быть включены в строка запроса.

Кодирование подписи

Чтобы закодировать подпись, позвоните Алгоритм HMAC-SHA256 на UTF-8-кодированная строка подписи и закодировать результат как Base64. Использовать следующий формат (отображается как псевдокод): копия

* +1034 * Подпись = Base64 (HMAC-SHA256 (UTF8 (StringToSign)))

Кажется, я не могу понять суть этого. И не похоже, чтобы слишком много людей делали лазурные запросы с iphone:).

Спасибо Скотт

1 Ответ

0 голосов
/ 06 ноября 2010

Смаркс объяснил мне лучшую практику на форуме Azure.Вот что он написал: Есть два безопасных способа доступа к хранилищу с клиента:

1.Используйте подписи общего доступа с BLOB-объектами.На стороне сервера вы можете сгенерировать подпись (в основном подписанный URL-адрес), и эта подпись ограничена по объему (возможно, для конкретного большого двоичного объекта, определенных разрешений и ограниченного количества времени).2. Только доступ к веб-службе с клиента и доступ к хранилищу веб-службы.В обоих случаях между ними есть сервер, как в веб-приложении.(Браузер никогда не обращается к вашей базе данных SQL ... он обращается к вашему веб-сайту, который затем обращается к базе данных.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...