Podpisz połączenie z Coinbase Pro API za pomocą Google Apps Script
Oszaleję, próbując wysłać moje pierwsze wywołanie API do Coinbase Pro za pomocą Google Apps Script. W node.js jest całkiem proste (https://docs.pro.coinbase.com/#signing-a-message), ale zrobienie tego samego ze skryptami Google to po prostu powracający raz po raz „Nieprawidłowy podpis”.
Oto kod, którego używam:
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);
}
Naprawdę potrzebuję pomocy :-) - Dzięki!
Odpowiedzi
W Twoim skrypcie zakłada się, że nagłówki żądań z wyjątkiem wartości CB-ACCESS-SIGNi punktu końcowego są poprawne. Proszę, uważaj na to.
Punkt modyfikacji:
- W przypadku
Utilities.base64Decode(secret).toString()tablicy tablica jest konwertowana na łańcuch. Myślę, że to może być powód twojego problemu.
Kiedy powyższy punkt zostanie odzwierciedlony, wygląda to następująco.
Zmodyfikowany skrypt:
W tym przypadku funkcja SignAPICalljest modyfikowana.
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;
}
- W tym przypadku
valueikeyofcomputeHmacSha256Signature(value, key)są tablicą bajtów.
Uwaga:
- Kiedy sprawdziłem powyższy zmodyfikowany skrypt, porównując przykładowe skrypty z oficjalnego dokumentu , mogłem potwierdzić, że można uzyskać ten sam wynik.
- Niestety nie mogę przetestować żądania do API przy użyciu powyższego zmodyfikowanego skryptu, podczas gdy mogę potwierdzić, że ten sam podpis z przykładowego skryptu w oficjalnym dokumencie jest pobierany z powyższego zmodyfikowanego skryptu. Przetestuj żądanie w swoim środowisku. Gdy zażądałeś do API za pomocą powyższego zmodyfikowanego skryptu, gdy wystąpi błąd, sprawdź ponownie nagłówki żądania, punkt końcowy i hasło.
Bibliografia:
- Podpisywanie wiadomości
- base64Decode (zakodowane)
- computeHmacSha256Signature (wartość; klucz)
W końcu znalazłem na to rozwiązanie. Wystąpił problem z typem danych, które przesłałem do „Utilities.computeHmacSha256Signature”. W kodzie można znaleźć funkcję działającą dobrze.
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);
}