Я пытаюсь сделать подписанный запрос к торговому API на bitfloor.com (это REST API)
Bitfloor дает мне:
1) Ключ API (например, 6bd2b780-00be-11e2-bde3-2837371c3c3a)
2) Секретный ключ (например, oaFz62YpmbWiXwseMUSod53D8pOjdyVcweNYdiab/TSQqxk6IuemDvimNaQoA==)
Ниже приведены точные инструкции Bitfloor по выполнению запроса:
Запросы должны быть HTTPS POST-запросами на порт 443 (https). Каждый запрос должен содержать необходимые заголовки (перечислены ниже). Заголовки идентифицируют, проверяют и подтверждают ваш запрос, чтобы предотвратить несанкционированное вмешательство. заголовки
bitfloor-key Предоставляется Bitfloor для уникальной идентификации вашей учетной записи. (например, 6bd2b780-00be-11e2-bde3-2837371c3c3a)
bitfloor-sign Поле знака представляет собой sha512-hmac тела запроса с использованием секретного ключа, соответствующего вашему ключу API.
Чтобы подписать ваш запрос: base64 декодирует секретный ключ в необработанные байты (64 байта). Используйте эти байты для подписи sha512-hmac тела http-запроса. Base64 кодирует результат подписи и отправляет в этом поле заголовка.
bitfloor-passphrase Парольная фраза, которую вы указали при создании этого ключа API. Мы не сможем восстановить вашу парольную фразу, если вы ее забыли. Вам нужно будет создать новый ключ API.
bitfloor-version Версия API интересующего вас ресурса. Единственным допустимым значением в настоящее время является 1.
После полных восьми часов проб и ошибок и повторного поиска в Интернете любого рода идей или информации, следующий код настолько близок, насколько я могу прийти к тому, что, как я думаю, может быть где-то в направлении того, как правильно построить запрос, увы, что бы я ни пытался, я получаю «Неверную подпись», возвращаемую их API.
Вот что у меня пока...
ВО-первых, я нашел в Интернете эту функцию, которую кто-то написал для подписи SHA512:
<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>
Я понятия не имею, что он делает, но, похоже, он работает и делает это без ошибок.
Вот моя реализация этой функции и моя попытка сделать запрос: ПРИМЕЧАНИЕ. Значение «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, который знаком с подписанными запросами. Я в своем уме.
Пожалуйста помоги! Намасте