Ios 从Swift访问Azure表存储

Ios 从Swift访问Azure表存储,ios,swift,http,azure,authentication,Ios,Swift,Http,Azure,Authentication,我想从Swift访问azure表存储。 制作标题的说明如下: 但是,我已尝试构建请求,但无法使其工作: let urlString = "https://<myaccount>.table.core.windows.net/MyTable" let storageUrl = NSURL( string: urlString) let request = NSMutableURLRequest(URL: storageUrl!) //making the

我想从Swift访问azure表存储。 制作标题的说明如下: 但是,我已尝试构建请求,但无法使其工作:

 let urlString =   "https://<myaccount>.table.core.windows.net/MyTable"
    let storageUrl = NSURL( string: urlString)
    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.stringFromDate(currentDate)
    print(httpTime)

    let signingString = "GET\n\n\n\(httpTime)\n/<myaccount>/MyTable"
    print(signingString)


    let keyString = <myKeyString>
    let keyData = keyString.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion: false)!
    let signingData = signingString.dataUsingEncoding(NSUTF8StringEncoding, 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 hashString = hash.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([]))
    hashResult.destroy()
    //print(hashString)

    request.setValue("SharedKeyLite <myaccount>:\(hashString)", 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 datastring = NSString(data:data, encoding:NSUTF8StringEncoding)
            print( datastring! )

            //print(response)

        } else {

            print( error )

        }
    }).resume()
let urlString=”https://.table.core.windows.net/MyTable"
让storageUrl=NSURL(字符串:urlString)
let request=NSMutableURLRequest(URL:storageUrl!)
//确定日期
让currentDate=NSDate()
让httpFormatter=NSDateFormatter()
httpFormatter.timeZone=NSTimeZone(缩写:“GMT”)
httpFormatter.dateFormat=“EEE”,“dd-MMM-yyyy-HH':“mm”:“ss-z”
让httpTime=httpFormatter.stringFromDate(currentDate)
打印(httpTime)
let signingString=“GET\n\n\n\(httpTime)\n//MyTable”
打印(签名字符串)
设键串=
让keyData=keyString.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:false)!
让signingData=signingString.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:false)!
let length:Int=Int(CC\u SHA256\u DIGEST\u length)
让hashResult=unsafemeutablepointer.alloc(长度)
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256),keyData.bytes,Int(keyData.length),signingData.bytes,Int(signingData.length),hashResult)
打印(哈希结果)
让hash=NSData(字节:hashResult,长度:Int(CC_SHA256_DIGEST_length))
让hashString=hash.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([]))
hashResult.destroy()
//打印(哈希字符串)
request.setValue(“SharedKeyLite:\(hashString)”,用于HttpHeaderField:“授权”)
request.setValue(“0”,用于HttpHeaderField:“内容长度”)
request.setValue(“application/json”,forHTTPHeaderField:“Content Type”)
request.setValue(httpTime,用于httpheaderfield:“x-ms-date”)
request.setValue(“,用于HttpHeaderField:“日期”)
request.HTTPMethod=“GET”
NSURLSession.sharedSession().dataTaskWithRequest(请求,completionHandler:{(数据,响应,错误)位于
如果let data=data{
让datastring=NSString(数据:数据,编码:NSUTF8StringEncoding)
打印(数据字符串!)
//打印(答复)
}否则{
打印(错误)
}
})1.简历()
在下面给出正确答案后,我对字符串进行了扩展,因此hmac签名非常容易:

//
//  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 String {

        func hmac(algorithm: CryptoAlgorithm, key: String) -> String {


            let strData = self.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
            let keyData = NSData(base64EncodedString: 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 hashString = hash.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([]))
            hashResult.destroy()
            return hashString
        }
    }
//
//斯威夫特
//老挝试验项目
//
//由Lars Christoffersen于2016年1月2日创建。
//版权所有©2016拉尔斯·克里斯托弗森。版权所有。
//
进口基金会
枚举加密算法{
案例MD5、SHA1、SH224、SH256、SH384、SH512
var-HMACAlgorithm:CCHmacAlgorithm{
变量结果:Int=0
切换自身{
case.MD5:result=kCCHmacAlgMD5
case.SHA1:result=kCCHmacAlgSHA1
case.SHA224:result=kCCHmacAlgSHA224
case.SHA256:result=kCCHmacAlgSHA256
case.SHA384:result=kCCHmacAlgSHA384
case.SHA512:result=kCCHmacAlgSHA512
}
返回CCHmacAlgorithm(结果)
}
变量长度:Int{
变量结果:Int32=0
切换自身{
case.MD5:result=CC\u MD5\u DIGEST\u LENGTH
case.SHA1:result=CC\u SHA1\u DIGEST\u长度
case.SHA224:result=CC\u SHA224\u DIGEST\u长度
case.SHA256:result=CC\u SHA256\u DIGEST\u LENGTH
case.SHA384:result=CC\u SHA384\u DIGEST\u长度
case.SHA512:result=CC\u SHA512\u DIGEST\u LENGTH
}
返回整数(结果)
}
}
扩展字符串{
func hmac(算法:加密算法,密钥:字符串)->String{
让strData=self.dataUsingEncoding(NSUTF8StringEncoding,allowossyconversion:false)!
让keyData=NSData(base64EncodedString:key,options:NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!
设digestLen=algorithm.digestLength
让hashResult=unsafemeutablepointer.alloc(digestLen)
CCHmac(algorithm.HMACAlgorithm,keyData.bytes,Int(keyData.length),strData.bytes,Int(strData.length),hashResult)
let hash=NSData(字节:hashResult,长度:digestLen)
让hashString=hash.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([]))
hashResult.destroy()
返回哈希字符串
}
}
终于让它工作了:)

以下是我列出Azure存储帐户中所有表的代码:

//
//  main.swift
//  Azure Storage REST Helper
//
//  Created by Gaurav Mantri on 1/2/16.
//

import Foundation
let accountName = "{account-name}"
let urlString = "https://{account-name}.table.core.windows.net/Tables"
let storageUrl = NSURL(string: urlString)
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.stringFromDate(currentDate)
print(httpTime)

let signingString = "GET\n\n\n\(httpTime)\n/{account-name}/Tables"
print(signingString)
let keyString = "{account-key}"
let keyData = NSData(base64EncodedString: keyString, options: NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!

let signingData = signingString.dataUsingEncoding(NSUTF8StringEncoding, 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 hashString = hash.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([]))
hashResult.destroy()

print(hashString)

request.setValue("SharedKey {account-name}:\(hashString)", 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 datastring = NSString(data:data, encoding:NSUTF8StringEncoding)
        print( datastring! )
        print("comes here 1")
        //print(response)

    } else {
        print("comes here 2")
        print( error )

    }
}).resume()
//
//梅因·斯威夫特
//Azure存储REST助手
//
//由Gaurav Mantri于2016年1月2日创作。
//
进口基金会
let accountName=“{account name}”
让urlString=“https://{account name}.table.core.windows.net/Tables”
让storageUrl=NSURL(字符串:urlString)
let request=NSMutableURLRequest(URL:storageUrl!)
让currentDate=NSDate()
让httpFormatter=NSDateFormatter()
httpFormatter.timeZone=NSTimeZone(缩写:“GMT”)
httpFormatter.dateFormat=“EEE”,“dd-MMM-yyyy-HH':“mm”:“ss-z”
让httpTime=httpFormatter.stringFromDate(currentDate)
打印(httpTime)
let signingString=“GET\n\n\n\(httpTime)\n/{account name}/Tables”
打印(签名字符串)
let keyString=“{account key}”
让keyData=NSData(base64EncodedString:keyString,options:NSDataBase64DecodingOptions.IgnoreUnknownCharacters)!
让signingData=signingString.dataUsingEncoding(NSUTF8StringEncoding,allowLossyConversion:false)!
let length:Int=Int(CC\u SHA256\u DIGEST\u length)
让hashResult=unsafemeutablepointer.alloc(长度)
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256),keyData.bytes,Int(keyData.length),signingData.bytes,Int(signingData.length),hashResult)
打印(哈希结果)
让hash=NSData(字节:hashResult,长度:Int(CC_SHA256_DIGEST_length))
让hashString=hash.base64EncodedStringWithOptions(NSDataBase64EncodingOptions([]))
hashResult.destroy()
打印(哈希字符串)
request.setValue(“SharedKey{account name}:\(hashString)”,forHTTPHeaderField:“Authorization”)
request.se