将Node.JS代码片段转换为Javascript(Google Apps脚本)

我想将下面的Node.JS代码片段转换为JavaScript ,以便在Google Apps脚本中运行它:

来自:Node.JS

 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; } 

这是我到目前为止所尝试的代码(以及它的许多变体):

致:JavaScript / Google Apps脚本

 function getMessageSignature(url, request, nonce) { // Message signature using HMAC-SHA512 of (URI path + SHA256(nonce + POST data)) //and base64 decoded secret API key const secretApiKey = 'wdwdKswdKKewe23edeYIvL/GsltsGWbuBXnarcxZfu/9PjFbXl5npg=='; var secretApiKeyBytes = Utilities.base64Decode(secretApiKey); var blob = Utilities.newBlob(secretApiKeyBytes); var secretApiKeyString = blob.getDataAsString(); // POTENTIAL ERROR HERE? var json = Utilities.jsonStringify(request); var hash_digest = Utilities.computeDigest(Utilities.DigestAlgorithm.SHA_256, nonce + json); var hmac_digest = Utilities.computeHmacSignature(Utilities.MacAlgorithm.HMAC_SHA_512, url + hash_digest, secretApiKeyString); // POTENTIAL ERROR HERE? var base64 = Utilities.base64Encode(hmac_digest); return base64; } 

在将签名作为我的请求的一部分发送给服务器时,我始终从服务器收到错误消息: Invalid Key

顺便说一句:这是我想在JavaScript中使用的API : Kraken API

我将非常感谢任何暗示或build议!

一个问题是querystring.stringifyUtilities.jsonStringify不一样(FYI被弃用,而不赞成使用JSON.stringify )。

我相信这是相同的:

 function queryStringify(obj) { var params = []; for(var key in obj) { if(Object.hasOwnProperty(key)) { if(typeof key === 'string') { params.push([key, obj[key]]); } else { obj[key].forEach(function(val) { params.push([key, val]); }); } } } return params.map(function(param) { return encodeURIComponent(param[0]) + '=' + encodeURIComponent(param[1]); }).join('&'); } 

虽然我不确定这是否是你看到你的错误的原因。

解:

使用jsSHA( https://github.com/Caligatio/jsSHA/ )而不是Google App脚本的function。 在Google App脚本中创build一个新的“jsSHA.gs”代码文件,并从github中复制/过去所有jsSHA优化的.js文件。

 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 (api_key_private, "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 = api_url + path; var options = { method: 'post', headers: { 'API-Key': api_key_public, 'API-Sign': signature }, payload: postdata }; var response = UrlFetchApp.fetch (url, options); // ERROR handling return response.getContentText (); } 

我注意到这个nodejs到GS转换器: https ://www.npmjs.com/package/codegs

没有机会使用它,但它声称处理“要求”的陈述。