Мне нужна помощь, чтобы исправить заголовки для запроса хранения таблицы 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
строка в этом формате выглядит следующим образом:
Начиная с пустой строки (""), добавьте косую черту (/),
сопровождается именем учетной записи
которому принадлежит доступ к ресурсу.
Добавить кодированный путь ресурса URI. Если адрес запроса URI
компонент ресурса, добавить
соответствующая строка запроса.
Строка запроса должна включать
знак вопроса и параметр комп
(например,? comp = метаданные). нет
другие параметры должны быть включены в
строка запроса.
Кодирование подписи
Чтобы закодировать подпись, позвоните
Алгоритм HMAC-SHA256 на
UTF-8-кодированная строка подписи и
закодировать результат как Base64. Использовать
следующий формат (отображается как
псевдокод): копия
* +1034 * Подпись = Base64 (HMAC-SHA256 (UTF8 (StringToSign)))
Кажется, я не могу понять суть этого. И не похоже, чтобы слишком много людей делали лазурные запросы с iphone:).
Спасибо
Скотт