5

chciałbym przekonwertować następujący kod Node.JS fragment do JavaScript w celu uruchomienia go w Google Apps Script:Konwersja node.js fragment kodu na Javascript (Google Apps Script)

Od: 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; 
} 

jest to kod próbowałem tak daleko (i wiele odmian tego):

Do: JavaScript/Google Apps Script

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; 
} 

Wysyłając podpis jako część mojego żądanie do serwera, zawsze pojawia się komunikat o błędzie z serwera: Invalid Key.

BTW: Jest to API, które chciałbym użyć w JavaScript: Kraken API

Byłbym wdzięczny za każdą wskazówkę lub sugestie bardzo !!

+0

Przez całą noc waliłem głową w to wszystko. Opublikuj swoje rozwiązanie, jeśli już to wymyśliłeś. Funkcje kryptograficzne w NodeJS i Google App Script wydają się różnić w wynikach. –

Odpowiedz

2

Jednym z problemów jest to, że querystring.stringify to nie to samo co Utilities.jsonStringify (które, FYI, jest przestarzałe na rzecz JSON.stringify).

Wierzę, że będzie to równoważne:

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('&'); 
} 

Chociaż nie jestem pewien, czy to jest powód widzisz swój błąd.

+0

Dziękuję za odpowiedź, Paul! Wierzę, że błąd jest gdzie indziej, ponieważ dostaję błąd, nawet gdy "hard kodować" JSONified ciąg w mojej prośbie. Wierzę, że mój problem mógł pochodzić z 'url + hash_digest', który jest operacją łańcuchową, ale powinien być operacją bajtową. – AlexR

+0

@AlexR Masz szczęście, że to zadziała? Próbuję zrobić to samo. –

4

Rozwiązanie:

Zastosowanie jsSHA (https://github.com/Caligatio/jsSHA/) zamiast funkcji skryptu Google App. Utwórz nowy plik kodu "jsSHA.gs" w Skrypcie aplikacji Google i skopiuj/wklej we wszystkich zoptymalizowanych plikach jsSHA .js z github.

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(); 
} 
+0

Dzięki! To naprawdę zadziałało dla mnie! – LeandroP

+0

Jesteś ratownikiem: wink: – king

Powiązane problemy