承诺的REST REST调用:无法获得有效的签名

时间:2018-10-24 15:08:26

标签: javascript node.js encryption es6-promise

我真的很难理解js的行为。

var rp = require('request-promise');
var crypto = require('crypto');



var options = {

  method : 'GET',
  uri : "https://api.binance.com/api/v1/order",

  qs: {
    signature : hash,

    timestamp : Date.now(),
    symbol : 'LTCBTC' 
  },
 headers: {
    'X-MBX-APIKEY' : 'PUBLICKEY'
  },
    json : true
};

var hash= crypto.createHmac('sha256', options.toString())
.update('SECRETKEY')
.digest('hex');

 //console.log(hash);
rp(options)

    .then(function (Bbody) {
        console.log(Bbody);
    })

    .catch(function (err) {
      console.log(err);
    });

如果我使用hash函数并将其放在options之前

(显然)说

  

TypeError:无法读取未定义的属性'toString'

但是如果我按照共享代码中的说明放置,则会出现此错误:

  

StatusCodeError:400-{“代码”:-1102,“ msg”:“必填参数'signature'未发送,为空/空或格式错误。”}

这是请求的输出:

 options:                                                                                                                 
{ method: 'GET',                                                                                                          
uri: 'https://api.binance.com/api/v1/order',                                                                            
qs:                                                                                                                      
{ signature: undefined,                                                                                                   
timestamp: 1540392736646,                                                                                               
symbol: 'LTCBTC' },                                                                                                  
headers:                                                                                                                 
{ 'X-MBX-APIKEY': 
'PUBLICKEY' },                                
json: true,                                                                                                             
callback: [Function: RP$callback],                                                                                      
transform: undefined,                                                                                                   
simple: true,                                                                                                           
resolveWithFullResponse: false,                                                                                         
transform2xxOnly: false }, 

如果我取消注释console.log(),则在请求被拒绝之前,我会获得正确的哈希值打印在视频上作为第一个输出。仍然电话无法接听。

我曾经用作文档:

binance api documentation

this node documentation for the crypto library

and this npm doc to promisify api calls

P.S。 :PUBLICKEYSECRETKEY是占位符,但是在我的测试中,我使用了正确的字符串。

1 个答案:

答案 0 :(得分:2)

JavaScript中有一个叫做variable hoisting的东西。基本上,JavaScript会将hash变量的声明秘密地移动为var hash;到脚本的开头。在构造options变量时,hash仍未定义。

除了变量提升之外,我认为您将无法生成应包含相同哈希值的JavaScript对象的哈希。根据{{​​3}},您需要执行以下步骤:

  1. 为您的请求获取所有输入参数(符号,边,...,时间戳),并将它们组合成查询字符串,例如symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559
  2. 从查询字符串
  3. 计算HMAC SHA256 签名
  4. 通过以下两种方式之一发出请求:
    • 在URL中包含所有输入参数签名作为查询参数(例如:https://api.binance.com/api/v3/order?symbol=LTCBTC&side=BUY&type=LIMIT&...&signature=<your sha256 here>
    • 在请求正文中包含所有输入参数签名,并再次使用&
    • 进行连接