2012-10-16 10 views
14

私は、トレーディングAPIへの署名要求を作成しようとしていますを締結しColdFusionのCFHTTPがbitfloor.comでRESTリクエストボディ

Bitfloorは私与えます(それはREST APIがあります)キー(すなわち6bd2b780-00be-11E2-bde3-2837371c3c3a)

2)秘密鍵(すなわちoaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA ==)

次の要求を行うためのBitfloorの正確な指示です:

リクエストは、HTTPS POSTリクエストでポート443(https)でなければなりません。各リクエストには必須のヘッダーが含まれている必要があります(下記参照)。ヘッダーは、改ざんを防止するための要求を識別、検証、および検証します。 ヘッダー

bitfloor-keyこれは、アカウントを一意に識別するためにbitfloorによって提供されます。 (すなわち6bd2b780-00be-11E2-bde3-2837371c3c3a)

bitfloor-SIGN符号フィールドは、APIキーに対応する秘密鍵を使用して、リクエストボディのSHA512-HMACです。

リクエストに署名するには、 base64は、生のバイト(64バイト)に秘密鍵をデコードします。これらのバイトは、http要求本体のsha512-hmac署名に使用します。 Base64は署名結果をエンコードし、このヘッダーフィールドに送信します。

bitfloor-passphraseこのapiキーの作成時に指定したパスフレーズ。パスフレーズを忘れても元に戻すことはできません。新しいAPIキーを作成する必要があります。

bitfloorバージョンあなたが興味を持っているリソースのAPIバージョン。唯一の有効な値は、現在1


試行錯誤の完全な8時間後

といずれかの繰り返しインターネットを検索です洞察力や情報のようなものですが、次のコードは、要求が正しく構築される方法の方向にどこかにあると思います。 API。

<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false"> 
    <cfargument name="signKey" type="string" required="true"> 
    <cfargument name="signMessage" type="string" required="true"> 

    <cfset var jMsg = JavaCast("string",arguments.signMessage).getBytes("iso-8859-1")> 
    <cfset var jKey = JavaCast("string",arguments.signKey).getBytes("iso-8859-1")> 
    <cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec")> 
    <cfset var mac = createObject("java","javax.crypto.Mac")> 
    <cfset key = key.init(jKey,"HmacSHA512")> 
    <cfset mac = mac.getInstance(key.getAlgorithm())> 
    <cfset mac.init(key)> 
    <cfset mac.update(jMsg)> 
    <cfreturn mac.doFinal()> 
</cffunction> 

私はそれが何をするか分からない:ここでは

が...私がこれまで持っているものFIRST

ですが、私は誰かがSHA512署名を行うために書いたことをウェブ上でこの機能を見つけましたしかし、それはうまくいくように見え、間違いなく。

ここにこの機能の実装とリクエストを行う試みを示します。 注:「nonce」の値は、リクエストとともに送信する必要がある必須のパラメータです。

<cffunction name="myorders"> 
    <cfset nonce  = dateDiff("s",createDateTime(2012,01,01,0,0,0),now())> 
    <cfset requestbody = "?nonce=#nonce#"> 
    <cfset key  = "oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA=="> 
    <cfset sign  = HMAC_SHA512(key,requestbody)> 
    <cfset signed  = binaryEncode(sign,"Base64")> 

    <!--- HTTP REQUEST ---> 
    <cfhttp url = "https://api.bitfloor.com/orders#requestbody#" 
     method = "post" 
     result = "bitfloor"> 

    <!--- HEADERS ---> 
    <cfhttpparam 
     type = "body" 
     value = requestbody> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-key" 
     value = "6bd2b780-00be-11e2-bde3-2837371c3c3a"> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-sign" 
     value = signed> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-passphrase" 
     value = "mysecretpassphrase"> 
    <cfhttpparam 
     type = "header" 
     name = "bitfloor-version" 
     value = "1"> 
    </cfhttp> 
</cffunction> 

私の混乱の大半は、「リクエストボディ」が何であるかを正確に知らないことから来ていると思います。私はおそらく正しいことに署名していないような気がする。

署名付きリクエストに精通しているColdfusionプログラマーがいることを希望します。私はウィットの終わりにいる。

助けてください!ナマステ

答えて

2

私はそのAPIを使用していないが、私はいくつかのテストを実行し、次の調整で動作するようです:

  • secretKey値はbase64エンコードであるので、あなたの署名機能はへ​​を使用する必要があります適切にバイトを抽出します。 String.getBytes(...)を使用すると、全く異なる結果になります。

  • 予想リクエストボディの値はわずかである:{「エラー」:(先頭"?"なし)nonce=#nonceValue#

  • それ以外の場合はコンテンツの解析に失敗し、応答が、Content-Type=application/x-www-form-urlencodedヘッダを必要とするように思われます。 "何ナンスが指定されていません"}

コード

<cfset apiKey = "6bd2b780-00be-11e2-bde3-2837371c3c3a"> 
<cfset secretKey = "oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA=="> 
<cfset passphrase = "your secret phrase"> 

<cfset requestBody = "nonce="& now().getTime()> 
<cfset signBytes = HMAC_SHA512(secretKey, requestbody)> 
<cfset signBase64 = binaryEncode(signBytes, "base64")> 

<cfhttp url="https://api.bitfloor.com/orders" method="post" port="443" result="bitfloor"> 
    <cfhttpparam type="header" name="Content-Type" value="application/x-www-form-urlencoded"> 
    <cfhttpparam type="header" name="bitfloor-key" value="#apiKey#"> 
    <cfhttpparam type="header" name="bitfloor-sign" value="#signBase64#"> 
    <cfhttpparam type="header" name="bitfloor-passphrase" value="#passphrase#"> 
    <cfhttpparam type="header" name="bitfloor-version" value="1"> 
    <cfhttpparam type="body" value="#requestBody#"> 
</cfhttp> 

<cfdump var="#bitfloor#" label="Response"> 

<cffunction name="HMAC_SHA512" returntype="binary" access="public" output="false"> 
    <cfargument name="base64Key" type="string" required="true"> 
    <cfargument name="signMessage" type="string" required="true"> 
    <cfargument name="encoding" type="string" default="UTF-8"> 

    <cfset var messageBytes = JavaCast("string",arguments.signMessage).getBytes(arguments.encoding)> 
    <cfset var keyBytes = binaryDecode(arguments.base64Key, "base64")> 
    <cfset var key = createObject("java","javax.crypto.spec.SecretKeySpec")> 
    <cfset var mac = createObject("java","javax.crypto.Mac")> 
    <cfset key = key.init(keyBytes,"HmacSHA512")> 
    <cfset mac = mac.getInstance(key.getAlgorithm())> 
    <cfset mac.init(key)> 
    <cfset mac.update(messageBytes)> 

    <cfreturn mac.doFinal()> 
</cffunction> 
+0

本当にありがとうございます。リー!数百回の失敗の後に最終的に実際のデータが戻ってきたのを見たときに感じた喜びを説明することができれば幸いです。それは決してうまくいかないようだった。あなたは本当の命の恩人です!ありがとう、ありがとう、ありがとう!私はこのウェブサイトにこだわり、前もってお金を払うつもりです。ナマステ私の友人 – Jay

+0

助けてくれてうれしい! (新しいAPIキーを生成することを忘れないでください:) – Leigh

+0

このような難しい質問に答えるためのポイントを与えるためにここに来ました。 –

関連する問題