Unterzeichnen Sie einen Anruf bei der Coinbase Pro-API mit Google Apps Script

Aug 25 2020

Ich werde verrückt, wenn ich versuche, meinen ersten API-Aufruf mit Google Apps Script an Coinbase Pro zu senden. In node.js ist das ziemlich einfach (https://docs.pro.coinbase.com/#signing-a-message), aber dasselbe mit Google-Skripten zu tun, bringt immer wieder "Ungültige Signatur" zurück.

Dies ist der Code, den ich verwende:

function GetMyAccounts () {
  var globalvars_CB = {
   'apikey'     : 'f7d20a*******18c',
   'secret'     : '******pIIitRbWCv9N/mMWaR*****mGQMuI+m/vSbU1zuh5U6WFiFw==',
   'passphrase' : 'ceacdsewfcsa',
   'uri'        : 'https://api.pro.coinbase.com'
  }
  
  var requestPath = '/accounts';
  
  var timestamp = Math.floor(Date.now() / 1000);

  var options = {
    'method' : 'GET',
    'muteHttpExceptions' : true,     
    'headers' : {
      'Content-Type': 'application/json',
      'CB-ACCESS-KEY' : globalvars_CB.apikey,
      'CB-ACCESS-SIGN' : SignAPICall(globalvars_CB.secret, timestamp, 'GET', requestPath, ''),
      'CB-ACCESS-TIMESTAMP' : timestamp,
      'CB-ACCESS-PASSPHRASE' :  globalvars_CB.passphrase,
          }
  }  
    
  var responseJson = UrlFetchApp.fetch(globalvars_CB.uri+requestPath, options);
  
  Logger.log(responseJson);
 }
    

function SignAPICall(secret, timestamp, method, requestPath, body) {

  var what = (timestamp + method + requestPath + body);
  
  var decodedsecret = Utilities.base64Decode(secret).toString();
  
  var hmac = Utilities.computeHmacSha256Signature(what, decodedsecret);
 
  hmac = Utilities.base64Encode(hmac);
  
  return (hmac);    

}

Ich brauche wirklich Hilfe :-) - Danke!

Antworten

1 Tanaike Aug 25 2020 at 22:26

In Ihrem Skript wird davon ausgegangen, dass Ihre Anforderungsheader mit Ausnahme des Werts CB-ACCESS-SIGNund des Endpunkts korrekt sind. Bitte seien Sie vorsichtig.

Änderungspunkt:

  • Im Fall von Utilities.base64Decode(secret).toString()wird das Array in die Zeichenfolge konvertiert. Ich denke, dass dies der Grund für Ihr Problem sein könnte.

Wenn der obige Punkt reflektiert wird, wird er wie folgt.

Geändertes Skript:

In diesem Fall wird die Funktion SignAPICallgeändert.

function SignAPICall(secret, timestamp, method, requestPath, body) {
  var what = (timestamp + method + requestPath + body);
  var decodedsecret = Utilities.base64Decode(secret);  // Modified
  var res = Utilities.computeHmacSha256Signature(Utilities.newBlob(what).getBytes(), decodedsecret);  // Modified
  hmac = Utilities.base64Encode(res);
  return hmac;
}
  • In diesem Fall valueund keyvon computeHmacSha256Signature(value, key)sind die Bytearrays.

Hinweis:

  • Wenn ich das oben geänderte Skript durch Vergleichen der Beispielskripte des offiziellen Dokuments überprüft habe , konnte ich bestätigen, dass das gleiche Ergebnis erzielt werden kann.
  • Leider kann ich die Anforderung an die API nicht mit dem oben geänderten Skript testen, während ich bestätigen kann, dass dieselbe Signatur aus dem Beispielskript im offiziellen Dokument aus dem oben geänderten Skript abgerufen wird. Testen Sie daher die Anfrage in Ihrer Umgebung. Wenn Sie mit dem oben geänderten Skript eine Anfrage an die API gestellt haben und ein Fehler auftritt, überprüfen Sie die Anforderungsheader, den Endpunkt und das Geheimnis erneut.

Verweise:

  • Nachricht signieren
  • base64Decode (codiert)
  • computeHmacSha256Signature (Wert, Schlüssel)
AlbertSampietro Sep 06 2020 at 06:56

Ich habe endlich die Lösung dafür gefunden. Es war ein Problem mit der Art der Daten, die ich an "Utilities.computeHmacSha256Signature" gesendet habe. Im Code finden Sie die Funktion, die gut funktioniert.

function SignAndCallAPI(method, requestPath, body) {

  var timestamp = Math.floor(Date.now() / 1000).toString();
  
  var what = Utilities.base64Decode(Utilities.base64Encode(timestamp + method + requestPath + body));
  
  var decodedsecret = Utilities.base64Decode(globalvars_CB.secret);
  
  var hmac = Utilities.base64Encode(Utilities.computeHmacSha256Signature(what, decodedsecret));
     
  var options = {
    'method' : method,
    'muteHttpExceptions' : true,     
    'headers' : {
      'Content-Type': 'application/json',
      'CB-ACCESS-KEY' : globalvars_CB.apikey,
      'CB-ACCESS-SIGN' : hmac,
      'CB-ACCESS-TIMESTAMP' : timestamp,
      'CB-ACCESS-PASSPHRASE' :  globalvars_CB.passphrase,
     }
  }  
      
   var responseJson = UrlFetchApp.fetch(globalvars_CB.uri+requestPath, options);
  
  Logger.log(responseJson);
  return(responseJson);  

}