2016-09-03 6 views
1

hereと記載されているAPIを使用しようとしています。秘密鍵に基づくHMAC SHA512認可を使用します。HMACでAPIからデータを取得するSHA512 - Swift

実装の例は、PHPであり:

function bitmarket_api($method, $params = array()) 
{ 
    $key = "klucz_jawny"; 
    $secret = "klucz_tajny"; 

    $params["method"] = $method; 
    $params["tonce"] = time(); 

    $post = http_build_query($params, "", "&"); 
    $sign = hash_hmac("sha512", $post, $secret); 
    $headers = array(
     "API-Key: " . $key, 
     "API-Hash: " . $sign, 
); 

    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($curl, CURLOPT_URL, "https://www.bitmarket.pl/api2/"); 
    curl_setopt($curl, CURLOPT_POST, true); 
    curl_setopt($curl, CURLOPT_POSTFIELDS, $post); 
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); 
    $ret = curl_exec($curl); 

    return json_decode($ret); 
} 

それから私は、スウィフトにそれを実装しようとしていた。

import Alamofire 
import CryptoSwift 

func getRawJSON(method: String, params: [String]) -> String { 
    let publicKey = "publicKeyHere" 
    let secretKey = "secretKeyHere" 
    let APIURL = "https://www.bitmarket.pl/api2/" 

    var params = [ 
     "method": method, 
     "tonce:": NSDate().timeIntervalSince1970 
     ] as [String : Any] 

    let hmac: Array<UInt8> = try! HMAC(key: secretKey.utf8.map({$0}), variant: .sha512).authenticate(params) 

    var headers = [ 
     "API-Key": publicKey, 
     "API-Hash": hmac 
    ] as [String : Any] 
} 

あなたが気づいているように、データをフェッチするためのAlamofireの使用はありません私は送信するデータの準備に問題があるためです。私はCannot convert value of type '[String : Any]' to expected argument type 'Array<UInt8>'のときに私がhmac変数を宣言しようとしているときに、私はこのエラーが出ているので、私はCryptoSwiftで何かを混乱させたということです。

どうすれば解決できますか? paramsアレイをArray<UInt8に変換する必要があるかもしれませんが、その方法はわかりません。私はすべてが正しいことも確かではありません。

編集:マーティン・R、実際のコードに おかげである:

func getRawJSON(method: String, paramether: String) { 
    let publicKey = "publicKeyHere" 
    let secretKey = "secretKeyHere" 
    let APIURL = "https://www.bitmarket.pl/api2/" 

    let query = NSURLComponents() 
    query.queryItems = [NSURLQueryItem(name: "method", value: method) as URLQueryItem, 
         NSURLQueryItem(name: "tonce", value: String(Int(NSDate().timeIntervalSince1970))) as URLQueryItem] 

    let requestString = query.query! 
    let requestData = Array(requestString.utf8) 

    let params = [ 
     "method": method, 
     "tonce:": String(Int(NSDate().timeIntervalSince1970)) 
     ] as [String : Any] 

    let hmac: Array<UInt8> = try! HMAC(key: secretKey.utf8.map({$0}), variant: .sha512).authenticate(requestData) 

    let hmacData = Data(bytes: hmac) 
    let hmacString = hmacData.base64EncodedString() 

    let headers = [ 
     "API-Key": publicKey, 
     "API-Hash": hmacString 
    ] as [String : String] 

    Alamofire.request(APIURL, withMethod: .post, parameters: params, encoding: .url, headers: headers) 
     .responseJSON { response in 
     print(response) 
    } 
} 

残念ながら、機能(getRawJSON(method: "info", paramether: ""))を呼び出した後、私はエラーでJSONを取得しています:

{ 
error = 502; 
errorMsg = "Invalid message hash"; 
time = 1472910139; 
} 

私のハッシュには何が問題なのですか?指定されたパラメータからクエリ文字列を作成します。

答えて

0

あなたのスウィフトコードはPHPのバージョンに何

$post = http_build_query($params, "", "&"); 

不足しています。 あなたはどちらか「手動」という文字列を構築、またはNSURLComponentsを使用することができます。

let comps = NSURLComponents() 
comps.queryItems = [ NSURLQueryItem(name: "method", 
            value: "YOUR_METHOD"), 
        NSURLQueryItem(name: "tonce", 
            value: String(Int(NSDate().timeIntervalSince1970))) ] 
let requestString = comps.query! 
print(requestString) // method=YOUR_METHOD&tonce=1472893376 

は最後にHMAC 機能のために[UInt8]配列にこの文字列を変換します

let requestData = Array(requestString.utf8) 
print(requestData) // [109, 101, 116, ..., 54] 
+0

巨大なおかげで、多くのことを助けました。今、ハッシュに関する問題が発生しました。私の質問を詳細に編集しました。 – kkarol

+0

@kkarol:PHPコードの '$ post'と' $ sign'の値をSwiftコードの 'requestString'と' hmac'と比較します。 –

+0

'requestString'は' $ post'と同じですが、 '$ sign'は' hmac'と 'hmacString'とは異なります。 'hmacString'はbase64であり、' $ sign'は例えば。 '450043310da274122369bfc0ca621e47fb0b03857746c096a944748585fcd3280744ee4633711f98bbfe3bf0c199deec329a64b723799e597304cfd683ac40e6'。 'Array 'を正しいフォーマットに変換する方法を知らない。 – kkarol

関連する問題