Accès au stockage de table Azure à partir de Swift

Je veux accéder au stockage de la table azure de Swift. L'instruction pour faire l'entête est ici Cependant, j'ai essayé de build la requête mais je ne peux pas la faire fonctionner:

let urlSsortingng = "https://<myaccount>.table.core.windows.net/MyTable" let storageUrl = NSURL( ssortingng: urlSsortingng) let request = NSMutableURLRequest(URL: storageUrl!) //making the date let currentDate = NSDate() let httpFormatter = NSDateFormatter() httpFormatter.timeZone = NSTimeZone(abbreviation: "GMT") httpFormatter.dateFormat = "EEE',' dd MMM yyyy HH':'mm':'ss z" let httpTime = httpFormatter.ssortingngFromDate(currentDate) print(httpTime) let signingSsortingng = "GET\n\n\n\(httpTime)\n/<myaccount>/MyTable" print(signingSsortingng) let keySsortingng = <myKeySsortingng> let keyData = keySsortingng.dataUsingEncoding(NSUTF8SsortingngEncoding,allowLossyConversion: false)! let signingData = signingSsortingng.dataUsingEncoding(NSUTF8SsortingngEncoding, allowLossyConversion: false)! let length:Int = Int(CC_SHA256_DIGEST_LENGTH) let hashResult = UnsafeMutablePointer<CUnsignedChar>.alloc(length) CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyData.bytes, Int(keyData.length), signingData.bytes, Int(signingData.length), hashResult) print(hashResult) let hash = NSData(bytes: hashResult, length: Int(CC_SHA256_DIGEST_LENGTH)) let hashSsortingng = hash.base64EncodedSsortingngWithOptions(NSDataBase64EncodingOptions([])) hashResult.destroy() //print(hashSsortingng) request.setValue("SharedKeyLite <myaccount>:\(hashSsortingng)", forHTTPHeaderField: "Authorization") request.setValue("0", forHTTPHeaderField: "Content-Length") request.setValue("application/json", forHTTPHeaderField: "Content-Type") request.setValue(httpTime, forHTTPHeaderField: "x-ms-date") request.setValue("", forHTTPHeaderField: "Date") request.HTTPMethod = "GET" NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in if let data = data { let datassortingng = NSSsortingng(data:data, encoding:NSUTF8SsortingngEncoding) print( datassortingng! ) //print(response) } else { print( error ) } }).resume() 

Après la réponse correcte ci-dessous, j'ai fait une extension à la string, donc la signature hmac est très facile à faire:

 // // CryptoExtensions.swift // LaochTestProject // // Created by Lars Christoffersen on 02/01/16. // Copyright © 2016 Lars Christoffersen. All rights reserved. // import Foundation enum CryptoAlgorithm { case MD5, SHA1, SHA224, SHA256, SHA384, SHA512 var HMACAlgorithm: CCHmacAlgorithm { var result: Int = 0 switch self { case .MD5: result = kCCHmacAlgMD5 case .SHA1: result = kCCHmacAlgSHA1 case .SHA224: result = kCCHmacAlgSHA224 case .SHA256: result = kCCHmacAlgSHA256 case .SHA384: result = kCCHmacAlgSHA384 case .SHA512: result = kCCHmacAlgSHA512 } return CCHmacAlgorithm(result) } var digestLength: Int { var result: Int32 = 0 switch self { case .MD5: result = CC_MD5_DIGEST_LENGTH case .SHA1: result = CC_SHA1_DIGEST_LENGTH case .SHA224: result = CC_SHA224_DIGEST_LENGTH case .SHA256: result = CC_SHA256_DIGEST_LENGTH case .SHA384: result = CC_SHA384_DIGEST_LENGTH case .SHA512: result = CC_SHA512_DIGEST_LENGTH } return Int(result) } } extension Ssortingng { func hmac(algorithm: CryptoAlgorithm, key: Ssortingng) -> Ssortingng { let strData = self.dataUsingEncoding(NSUTF8SsortingngEncoding, allowLossyConversion: false)! let keyData = NSData(base64EncodedSsortingng: key, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)! let digestLen = algorithm.digestLength let hashResult = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen) CCHmac(algorithm.HMACAlgorithm, keyData.bytes, Int(keyData.length), strData.bytes, Int(strData.length), hashResult) let hash = NSData(bytes: hashResult, length: digestLen ) let hashSsortingng = hash.base64EncodedSsortingngWithOptions(NSDataBase64EncodingOptions([])) hashResult.destroy() return hashSsortingng } } 

Finalement, ça a marché 🙂

Voici mon code qui répertorie toutes les tables d'un count Azure Storage:

 // // main.swift // Azure Storage REST Helper // // Created by Gaurav Mansorting on 1/2/16. // import Foundation let accountName = "{account-name}" let urlSsortingng = "https://{account-name}.table.core.windows.net/Tables" let storageUrl = NSURL(ssortingng: urlSsortingng) let request = NSMutableURLRequest(URL: storageUrl!) let currentDate = NSDate() let httpFormatter = NSDateFormatter() httpFormatter.timeZone = NSTimeZone(abbreviation: "GMT") httpFormatter.dateFormat = "EEE',' dd MMM yyyy HH':'mm':'ss z" let httpTime = httpFormatter.ssortingngFromDate(currentDate) print(httpTime) let signingSsortingng = "GET\n\n\n\(httpTime)\n/{account-name}/Tables" print(signingSsortingng) let keySsortingng = "{account-key}" let keyData = NSData(base64EncodedSsortingng: keySsortingng, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)! let signingData = signingSsortingng.dataUsingEncoding(NSUTF8SsortingngEncoding, allowLossyConversion: false)! let length:Int = Int(CC_SHA256_DIGEST_LENGTH) let hashResult = UnsafeMutablePointer<CUnsignedChar>.alloc(length) CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyData.bytes, Int(keyData.length), signingData.bytes, Int(signingData.length), hashResult) print(hashResult) let hash = NSData(bytes: hashResult, length: Int(CC_SHA256_DIGEST_LENGTH)) let hashSsortingng = hash.base64EncodedSsortingngWithOptions(NSDataBase64EncodingOptions([])) hashResult.destroy() print(hashSsortingng) request.setValue("SharedKey {account-name}:\(hashSsortingng)", forHTTPHeaderField: "Authorization") request.setValue("0", forHTTPHeaderField: "Content-Length") request.setValue(httpTime, forHTTPHeaderField: "x-ms-date") request.setValue("", forHTTPHeaderField: "Date") request.HTTPMethod = "GET" print("comes here") NSURLSession.sharedSession().dataTaskWithRequest(request, completionHandler: { (data, response, error) in if let data = data { let datassortingng = NSSsortingng(data:data, encoding:NSUTF8SsortingngEncoding) print( datassortingng! ) print("comes here 1") //print(response) } else { print("comes here 2") print( error ) } }).resume() 

Quelques choses que j'ai faites:

  • Au lieu d'utiliser l'enencoding UTF8 pour get keyData , j'ai créé NSData utilisant base64Encoding .
  • Je me suis débarrassé de l'en Content-Type tête Content-Type pour que le résultat soit renvoyé en XML. Si vous souhaitez renvoyer des données au format JSON, veuillez spécifier l'en-tête Accept au lieu de l'en Content-Type tête Content-Type .
  • Vous étiez en SharedKey créer une signature à l'aide SharedKey schéma SharedKey , mais vous avez spécifié SharedKeyLite dans l'en-tête Authorization . J'ai changé cela en SharedKey .

Oh, et s'il vous plaît ne jugez pas le code et n'hésitez pas à le modifier. Je sais que ce n'est pas le meilleur code 🙂