Unterzeichnen Sie einen Anruf bei der Coinbase Pro-API mit Google Apps Script
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
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
valueundkeyvoncomputeHmacSha256Signature(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)
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);
}