Hmac256 签名无效错误 Google App Script

Dru*_*gle 1 google-apps-script

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

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

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

3Commas 文档: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)
Run Code Online (Sandbox Code Playgroud)

}

Tan*_*ike 5

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

改装要点:

  • 似乎加密所需的值在https://3commas.io.
  • 您可以使用computeHmacSha256Signature()GAS 类实用程序中的方法加密这些值。在这种情况下,不需要使用 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)
}
Run Code Online (Sandbox Code Playgroud)

笔记:

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

参考:

我无法确认这个修改后的脚本是否有效。对于这种情况,我很抱歉。因此,如果它不起作用,我深表歉意。那个时候能不能提供一下情况的详细信息?