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

标签 javascript node.js hash google-apps-script digest-authentication

我想将以下 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;
}

当将签名作为请求的一部分发送到服务器时,我总是从服务器收到错误消息:无效 key

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

如果有任何提示或建议,我将不胜感激!!

最佳答案

解决方法:

使用 jsSHA ( https://github.com/Caligatio/jsSHA/ ) 而不是 Google App Script 的函数。在 Google App Script 中创建一个新的“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 ();
}

关于javascript - 将 Node.JS 代码片段转换为 Javascript(Google Apps 脚本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23033095/

相关文章:

c# - 在屏幕共享程序中存储带哈希的图像缓冲区的内存管理

ruby-on-rails - 将 Hash 更改为 ruby​​ 中的数组数组

javascript - Adobe Acrobat Javascript promise

javascript - 防止用户在具有数字类型的输入元素中输入负数

node.js - 即使 Redis 不可用,也会在启动时建立 'connection retry' 行为

javascript - Puppeteer 无法使用评估获取页面的innerHTML

node.js - 用 Jest mock Mongoose 模型

ruby - 奇怪的 Ruby 语法?

javascript - 聚光灯视频播放器 ||如何用它播放 HTML5 视频

javascript - 下载 pdf 格式的 D3 图