API0005 Ошибка подключения недопустимой подписи из скрипта Google Apps в API BitStamp - PullRequest
1 голос
/ 08 июня 2019

Я пытаюсь отобразить различные данные из моей учетной записи BitStamp в электронной таблице Google.Для этого используется Google Apps Script (GAS), конечно же, с Javascript.

Я получаю сообщение об ошибке API0005, которое , как вы можете видеть на справочной странице BitStamp API ,расшифровывается как неверная подпись:

API0005 Неверная подпись Опубликованная подпись не соответствует нашей

Теперь я собираю информацию от несколькихисточники, особенно здесь, в стеке, но не могу понять, где проблема.

Есть кое-что, что я заметил, хотя я хотел бы выделить, так как я думаю, что проблема может быть связана с этим:

Для простоты построения я добавляю основные этапы процесса синтеза подписи в саму электронную таблицу, чтобы лучше понять ее разработку.

Youзаметит небольшие изменения в выводе nonce даже между строкой кода и следующей, каждый раз, когда функция вызывается или вызывается;и это меня не удивляет, потому что я предполагаю, что каждый раз, когда вызывается nonce, проходит несколько миллисекунд, а вывод должен быть разным (в конце концов, он был специально разработан по этой причине, я думаю).

Но первое, о чем я беспокоюсь: нормально ли, что оно меняется даже при вызове преобразования toUpperCase()?(И, между прочим, это, в любом случае, не должно быть причиной проблемы)

Spreadsheet Cells Screenshot

var nonce = new (function() {
    this.generate = function() {
        var now = Date.now();
        this.counter = (now === this.last? this.counter + 1 : 0);
        this.last    = now;
        // add padding to nonce
        var padding = 
            this.counter < 10 ? '000' : 
                this.counter < 100 ? '00' :
                    this.counter < 1000 ?  '0' : '';
        return now+padding+this.counter;
    };
})();

//funzione write
function write() {

var cred = {
       id:'digit2118',
      key:'2RhZfUKIYJbT8CBYk6T27uRSF8Gufre',
   secret:'T8CBYk6T274yyR8Z2RhZfUxbRbmZZHJ'
};

//adding some cells output to monitor each step of the "conversion" 
var ss = SpreadsheetApp.getActiveSpreadsheet();
var sheet = ss.getSheets()[0];
var cell = sheet.getRange("B14");
cell.setValue(cred.id);
// .. and so on, see screen cap..

var message = nonce.generate() + cred.id +  cred.key;

var res = Utilities.computeHmacSha256Signature(cred.secret, message).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
var signature = res.toUpperCase();

// qui mettiamo i dati per fare la comunicazione vera e propria
var data = {
  key: cred.key,
  signature: res,
  nonce: nonce.generate()
};

var options = {
  'method' : 'post',
  //'contentType': 'application/json',
  // Convert the JavaScript object to a JSON string.
  //'payload' : JSON.stringify(data)
  'muteHttpExceptions' : true,
  'payload' : data
};

var risposta = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/balance/', options);
  var risposta2 = JSON.parse(risposta.getContentText());

  Logger.log(risposta2);
  //Logger.log(risposta.getContentText()); 
return signature;
}//end of write();

Logger.log(write());

Так что в итоге я могу 'я не вижу, где, но это должно быть что-то, чего мне не хватает.

(ps: вот откуда я получил код Nonce: Genece Nonce ,)

РЕДАКТИРОВАТЬ: Вопрос решен .

Обновлен код с проблемой и решением ниже.

Благодаря @ Tanaike

Ответы [ 2 ]

1 голос
/ 09 июня 2019

Как насчет этой модификации?

Точки модификации:

  • При аргументах Utilities.computeHmacSha256Signature(value, key), это value и key по порядку.
    • Пожалуйста, измените Utilities.computeHmacSha256Signature(cred.secret, message) на Utilities.computeHmacSha256Signature(message, cred.secret).

Изменен скрипт:

От:
var res = Utilities.computeHmacSha256Signature(cred.secret, message).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");
До:
var res = Utilities.computeHmacSha256Signature(message, cred.secret).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");

Примечание:

  • Если после вышеуказанной модификации возникает ошибка, исправьте nonce как постоянное значение в запросе и повторите попытку.
    • Я думаю, что nonce может потребоваться исправить в запросе.Об этом, пожалуйста, проверьте в своей среде.
    • Потому что, когда я увидел пример сценария для Node.js , nonce был зафиксирован как постоянное значение в запросе.

Ссылка:

Я не могу проверить эту модификацию в моемсреда.Так что, если это не было прямым решением вашей проблемы, я прошу прощения.Если сообщение об ошибке было изменено этой модификацией, также предоставьте его.

0 голосов
/ 09 июня 2019

После включения мудрого предложения, предоставленного @Tanaike, т. Е. Для правильного переключения value и key в команде Utilities.computeHmacSha256Signature(value, key), все еще не работало, и я все еще получал ошибку Invalid Signature API0005.

Короче говоря, проблема заключалась в другом упущении в коде:

Я правильно переключил подпись в toUpperCase(), но когда пришло время отправлять массив в BitStamp, я использовал для отправки строчные буквыверсия, которая была res вместо signature:

var signature = res.toUpperCase();

// qui mettiamo i dati per fare la comunicazione vera e propria
var data = {
  key: cred.key,
  signature: res,
  nonce: nonce.generate()
};

Деталь была исправлена, и теперь она работает нормально!Это полный и обновленный рабочий код , на ваше рассмотрение:

//funzione write
function write() {

/* nuova funzione nonce */
_generateNonce = function() {
  var now = new Date().getTime();

  if(now !== this.last)
    this.nonceIncr = -1;

  this.last = now;
  this.nonceIncr++;

  // add padding to nonce incr
  // @link /5111861/chisla-v-forme-001
  var padding =
    this.nonceIncr < 10 ? '000' :
      this.nonceIncr < 100 ? '00' :
        this.nonceIncr < 1000 ?  '0' : '';
  return now + padding + this.nonceIncr;
}

 var nonce = this._generateNonce(); //fine funzione

var cred = {
       id:'digit2118',
      key:'2RhZfUKIYJbT8CBYk6T27uRSF8Gufrer',
   secret:'T8CBYk6T274yyR8Z2RhZfUxbRbmZZHJr'
};

var message = nonce + cred.id +  cred.key;

var res = Utilities.computeHmacSha256Signature(message, cred.secret).map(function(e) {return ("0" + (e < 0 ? e + 256 : e).toString(16)).slice(-2)}).join("");

var signature = res.toUpperCase();

var data = {
  key: cred.key,
  signature: signature,
  nonce: nonce
};

var options = {
  'method' : 'post',
  //'contentType': 'application/json',
  // Convert the JavaScript object to a JSON string.
  //'payload' : JSON.stringify(data)
  'muteHttpExceptions' : true,
  'payload' : data
};

var risposta = UrlFetchApp.fetch('https://www.bitstamp.net/api/v2/balance/', options);
  var risposta2 = JSON.parse(risposta.getContentText());
  var risposta3 = risposta2['usd_balance'];
  Logger.log(risposta3);
return signature;
}//end of write();

...