J'ai besoin d'aide pour obtenir des en-têtes corrects pour une demande de stockage de la table azur depuis une application iPhone. Je me sers de ces deux postes pour essayer d'obtenir le chiffrement de la clé à droite, mais je suis toujours des problèmes: iPhone and HMAC-SHA-1 encoding Objective-C sample code for HMAC-SHA1 Le service retourne une erreur pour ma demande: Server n'a pas pu authentifier la demande avec cette erreur:Comment formater la demande de stockage de la table azure depuis l'iphone dans Object-c
Make sure the value of Authorization header is formed correctly including the signature.
J'utilise le code suivant pour faire la demande:
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;
Quels sont les résultats de ces en-têtes sont générés pour la demande:
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";
La spécification de la demande est ici: http://msdn.microsoft.com/en-us/library/dd179428.aspx qui fait référence à ce qui suit:
This format supports Shared Key and Shared Key Lite for all versions of the Table service, and Shared Key Lite for the 2009-09-19 version of the Blob and Queue services. This format is identical to that used with previous versions of the storage services. Construct the CanonicalizedResource string in this format as follows:
Beginning with an empty string (""), append a forward slash (/), followed by the name of the account that owns the resource being accessed.
Append the resource's encoded URI path. If the request URI addresses a component of the resource, append the appropriate query string. The query string should include the question mark and the comp parameter (for example, ?comp=metadata). No other parameters should be included on the query string.
Encoding the Signature
To encode the signature, call the HMAC-SHA256 algorithm on the UTF-8-encoded signature string and encode the result as Base64. Use the following format (shown as pseudocode): Copy
Signature=Base64(HMAC-SHA256(UTF8(StringToSign)))
Je ne peux pas sembler aller à la racine de celui-ci. Et il ne semble pas que trop de gens font des demandes azur de l'iphone :).
Merci Scott
Quel est le cas d'utilisation pour cela? Chaque utilisateur de cette application iPhone possède un compte de stockage? La raison pour laquelle la plupart des gens n'accèdent pas au stockage directement à partir du téléphone est qu'il n'y a pas de modèle de sécurité pour le faire sans laisser la clé au client (et ainsi donner à tout le monde un accès complet pour supprimer toutes vos données etc. – smarx
Je supposais que prendre ma clé et la crypter avant d'envoyer l'auth via le fil était assez sûr. Voulez-vous dire qu'il n'y a pas de modèle sécurisé dans la spécification REST pour le stockage de la table azure spécifié dans mon lien ci-dessus? Comment un utilisateur peut-il extraire la clé? –
@ ScottChamberlin merci beaucoup pour cette question.J'ai suivi votre même méthode et je reçois également la même erreur.Pouvez-vous s'il vous plaît dites-moi comment résoudre cela.Espérons pour votre aide.Merci à l'avance – suji