首页 > 解决方案 > Hmac256 Signature invalid error Google App Script

问题描述

我正在尝试从 Google Apps 脚本中名为 3Commas 的服务中检索交易。我以前使用过公共端点,但这是我第一次尝试使用签名端点。我目前收到一条错误消息:

[19-01-09 16:46:24:592 EST] {"error":"signature_invalid","error_description":"提供的签名无效"}

我猜这是我的格式问题。我正在使用jsSHA构建 HMAC 部分。我已经尝试按照文档中的示例进行操作。但我还没有完全明白。关于它可能是什么的任何建议?

3逗号文档:https ://github.com/3commas-io/3commas-official-api-docs#signed--endpoint-security

function main() {
  var key = 'apikey';
  var secret = 'apisecret';

  var baseUrl = "https://3commas.io/public/api";
  var endPoint = "/ver1/smart_trades";
  var pointParams = "?limit=10&offset=&account_id=&scope=&type="
  //base url + end point + params
  var queryString = baseUrl+endPoint+pointParams;

  var message = queryString;
  var secret = secret;
  var shaObj = new jsSHA("SHA-256", "TEXT");
  shaObj.setHMACKey(secret, "B64");
  shaObj.update(message);
  var signature = shaObj.getHMAC("B64");

  //headers
  var hparams = {
    'method': 'get',
    'headers': {'APIKEY': key,
                'Signature': signature},
    'muteHttpExceptions': true
  };
  //call
  var data = UrlFetchApp.fetch(queryString , hparams).getContentText();
  Logger.log(data)

}

标签: google-apps-script

解决方案


这个改装怎么样?从您问题中的3Commas Docs中,我提出如下修改点。

修改点:

  • 似乎加密所需的值是 after https://3commas.io
  • computeHmacSha256Signature()您可以使用GAS 的 Class Utilities 中的方法对值进行加密。在这种情况下,不需要使用 jsSHA。
    • 但是computeHmacSha256Signature()使用时,值变成有符号十六进制的字节数组。因此需要将其转换为无符号十六进制。

修改后的脚本:

function main() {
  var key = 'apikey';
  var secret = 'apisecret';

  var baseUrl = "https://3commas.io"; // Modified
  var endPoint = "/public/api/ver1/smart_trades"; // Modified
  var pointParams = "?limit=10&offset=&account_id=&scope=&type="; // or "?limit=10"
  var queryString = endPoint + pointParams; // Modified
  var signature = Utilities.computeHmacSha256Signature(queryString, secret); // Added
  signature = signature.map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");  // Added

  //headers
  var hparams = {
    'method': 'get',
    'headers': {'APIKEY': key,
                'Signature': signature},
    'muteHttpExceptions': true
  };
  //call
  var data = UrlFetchApp.fetch(baseUrl + queryString , hparams).getContentText(); // Modified
  Logger.log(data)
}

笔记:

  • 关于var pointParams = "?limit=10&offset=&account_id=&scope=&type=",对于您使用的端点,limit、offset、account_id、scope 和 type 不是强制性的。所以它可能是var pointParams = "?limit=10"。如果出现错误,请尝试。

参考:

我无法确认这个修改后的脚本是否有效。我很抱歉这种情况。所以,如果它不起作用,我很抱歉。届时,能否提供具体情况?


推荐阅读