将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.stringify
与Utilities.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
没有机会使用它,但它声称处理“要求”的陈述。
- 当请求来自另一个域时,如何在sailsJS后端应用程序中坚持authentication状态?
- 将非用户字段添加到有效内容以用于JWT令牌
- Nodejs,通过httpsauthentication并redirect到http
- expression3.0和护照authentication
- 如何在node.js中实现loginauthentication
- Node.js和Passport对象没有方法validPassword
- REST API和移动应用程序的身份validation策略
- 如果有基本授权,如何在Node.js中使用http.client
- 如何在Express.js中设置authentication中间件