【问题标题】:Kraken.com API: Generate the message signature in Google App ScriptKraken.com API:在 Google App Script 中生成消息签名
【发布时间】:2018-03-04 00:41:58
【问题描述】:

我想从 Kraken.com API 检索数据。我试图调用“私人”方法。 (那些需要认证)

这里准确地说:https://www.kraken.com/help/api

预期的签名是:

API-Sign = 使用 HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) 和 base64 解码 API 密钥的消息签名

我在这里从他们的 node.js 库中找到了一个可以完成这项工作的函数,但我似乎无法得到它。

/**
* This method returns a signature for a request as a Base64-encoded string
* @param  {String}  path    The relative URL path for the request
* @param  {Object}  request The POST body
* @param  {Integer} nonce   A unique, incrementing integer
* @return {String}          The request signature
*/
function getMessageSignature(path, request, nonce) {
    var message = querystring.stringify(request);
    var secret = new Buffer(config.secret, 'base64');
    var hash = new crypto.createHash('sha256');
    var hmac = new crypto.createHmac('sha512', secret);

    var hash_digest = hash.update(nonce + message).digest('binary');
    var hmac_digest = hmac.update(path + hash_digest, 'binary').digest('base64');

    return hmac_digest;
}

这是我的完整代码

function main() {
  var apiKey = "API-KEY";
  var apiSecret = "API-SECRET";

  var url = "https://api.kraken.com/0/private/Balance";
  var path = "/0/private/Balance";

  const nonce = new Date() * 1000;

  const payload = {
    'nonce': nonce
  };
  const postData = 'nonce=' + nonce;

  const signature = getMessageSignature(path, apiSecret, postData, nonce);

  var httpOptions = {
   'method': 'post',
    'headers': {
      "API-Key": apiKey,
      "API-Sign": signature
    },
   'payload': postData
 };

 var response = UrlFetchApp.fetch(url, httpOptions);
 Logger.log(response.getContentText());
}


function getMessageSignature(url, secret, data, nonce) {
  const hash = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, nonce + data);
  const hmac_digest = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, url + hash, Utilities.base64Decode(secret));
  return Utilities.base64Encode(hmac_digest);
}

但我最终得到了错误

{"error":["EAPI:Invalid key"]}

感谢期待。

【问题讨论】:

    标签: javascript api encoding google-apps-script cryptography


    【解决方案1】:

    我终于得到了使用jsSHA的代码

    function getKrakenSignature (path, postdata, nonce) {
        var sha256obj = new jsSHA ("SHA-256", "BYTES");
        sha256obj.update (nonce + postdata);
        var hash_digest = sha256obj.getHash ("BYTES");
    
        var sha512obj = new jsSHA ("SHA-512", "BYTES");
        sha512obj.setHMACKey ("HMACKEY", "B64");
        sha512obj.update (path);
        sha512obj.update (hash_digest);
        return sha512obj.getHMAC ("B64");
    }
    
    function getKrakenBalance () {
        var path = "/0/private/Balance";
        var nonce = new Date () * 1000;
        var postdata = "nonce=" + nonce;
    
        var signature = getKrakenSignature (path, postdata, nonce);
    
        var url = "https://api.kraken.com" + path;
        var options = {
        method: 'post',
        headers: {
            'API-Key': "<API-KEY>",
            'API-Sign': signature
        },
        payload: postdata
        };
    
        var response = UrlFetchApp.fetch (url, options);
    
    
        return response.getContentText ();
    }
    
    function main() {
        Logger.log(getKrakenBalance());
    }
    

    【讨论】:

    • 在哪里添加脚本,因为它返回:“ReferenceError: jsSHA is not defined”?
    • umm 不记得了,但我想我只是创建了一个文件 jssha.gs 并将 jsSHA 的内容粘贴到其中。
    • 它无论如何都不起作用:现在的问题是 TypeError: Cannot read property 'length' of undefined (anonima) @ (anonima) @ n.update @ n.update @ getKrakenSignature @
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    相关资源
    最近更新 更多