2012-10-16 6 views
14

내가 거래 API에 서명 된 요청을 만들려고 노력하고 서명ColdFusion에서는 cfhttp 태그가 bitfloor.com에서 REST 요청 본문

Bitfloor이 날 수 있습니다 (그것은 REST API를이다) 키 (예 : 6bd2b780-00be-11e2-bde3-2837371c3c3a) 다음

2) 비밀 키 (예 : oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA ==)

요청을 만들기위한 Bitfloor의 정확한 지침입니다 :

요청은 포트 443 (https)에서 HTTPS POST 요청이어야합니다. 각 요청에는 필수 헤더 (아래 나열)가 있어야합니다. 헤더는 변조를 방지하기 위해 요청을 식별하고 확인하며 유효성을 검사합니다. 헤더

bitfloor 키이는 고유 계정을 식별하는 데 bitfloor에 의해 제공됩니다. (즉 6bd2b780-00be-11e2-bde3-2837371c3c3a)

bitfloor 서명 부호 필드 API 키에 대응하는 비밀 키를 이용하여 상기 요청에 본체의 SHA512-HMAC이다.

요청에 서명하려면 base64 비밀 키를 원시 바이트 (64 바이트)로 디코딩하십시오. http 요청 본문의 sha512-hmac 서명에 해당 바이트를 사용하십시오. Base64는 서명 결과를 인코딩하고이 헤더 필드로 전송합니다.

bitfloor-passphrase이 api 키를 생성 할 때 지정한 암호입니다. 암호를 잊어 버린 경우 암호를 복구 할 수 없습니다. 새 API 키를 만들어야합니다.

bitfloor 버전에 관심이있는 자원의 API 버전. 유일한 유효 값이 현재 1


시행 착오의 전체 팔시간 후

하고 반복적 인터넷을 검색하다 통찰력이나 정보의 일종으로, 다음 코드는 내가 요청한 바에 상관없이 요청을 올바르게 구성하는 방법의 방향 어딘가에 있다고 생각하는 것에 가까이 갈 수 있습니다. "잘못된 서명"이 반환됩니다. 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로 인코딩되어 있기 때문에

  • , 당신의 서명 기능에 binaryDecode를 사용할 필요가 바이트를 올바르게 추출하십시오. 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

어려운 질문에 대답하기위한 요점을 제공하기 위해 여기에 왔습니다. –

관련 문제