google-apps-script - 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)
}
解决方案
这个改装怎么样?从您问题中的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"
。如果出现错误,请尝试。
参考:
我无法确认这个修改后的脚本是否有效。我很抱歉这种情况。所以,如果它不起作用,我很抱歉。届时,能否提供具体情况?
推荐阅读
- azure-web-app-service - 即使在 azure 上为应用服务启用了 Http2.0,部署在 azure 上的 React 应用程序也没有使用 Http2
- flutter - 在 just_audio 插件中暂停后继续我的音乐
- web-scraping - 如何保存飞溅饼干
- python - 在 for 循环的每次迭代中更改线图的颜色
- javascript - TypeError:无法在“HTMLSelectElement”上执行“添加”:提供的值不是“(HTMLOptionElement 或 HTMLOptGroupElement)”类型
- kubernetes - 从 kubernetes 访问 azure databricks 数据
- c - 如何实现数据输入验证
- git - 如何自动化一系列复杂的 git 历史重写?
- javascript - Jquery脚本不在脚本中工作但在控制台中工作
- amazon-web-services - AWS 爬虫卡在 STOPPING 状态