2010-11-05 13 views
1

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:

  1. Beginning with an empty string (""), append a forward slash (/), followed by the name of the account that owns the resource being accessed.

  2. 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

+0

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

+0

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é? –

+0

@ 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

Répondre

0

Smarx a expliqué la meilleure pratique pour moi sur le forum Azure. Voici ce qu'il a écrit: Il existe deux façons sécurisées d'accéder au stockage à partir du client:

1.Utilisez les signatures d'accès partagé avec des blobs. Du côté serveur, vous pouvez générer la signature (essentiellement une URL signée), et cette signature est limitée dans sa portée (peut-être un blob particulier, des autorisations particulières et un temps limité). 2.Accédez uniquement au service Web du client et demandez au service Web d'accéder au stockage. Dans les deux cas, il y a un serveur intermédiaire, un peu comme dans une application web. (Le navigateur ne parle jamais à votre base de données SQL ... il parle à votre site Web, qui parle ensuite à la base de données.)

+0

im également face à la même erreur.Can vous s'il vous plaît me guider comment vous résolvez cette erreur.Hoping pour votre aide. – suji

+0

La réponse de tri est de ne pas accéder au stockage de la table depuis votre client iPhone. Vous devez créer un service Web qui accède au stockage et accéder au service Web à partir de votre client iphone. –