Invalid_Nonce аутентификация на Crypto.com Google Script

Для частных конечных точек Crypto.com я получаю сообщение об ошибке:

{ id: xx,
  method: 'private/get-order-detail',
  code: 10007,
  message: 'INVALID_NONCE' }

для следующего кода:

function getOrderStatus() {
  var nonce = Math.floor(new Date().setSeconds(new Date().getSeconds() - 10) / 1000);
  nonce += 1; // Increment nonce for each request, is this the increase?
  var payload = {
    "id": orderId,
    "method": "private/get-order-detail",
    "params": {
      "order_id": orderId
    },
    "nonce": nonce
  };
  var payloadString = JSON.stringify(payload);
  var signature = Utilities.computeHmacSha256Signature(payloadString, secretKey);
  var signatureHex = Utilities.base64Encode(signature).toString();
  var headers = {
    "Content-Type": "application/json",
    "API-Key": apiKey,
    "Signature": signatureHex,
    "Timestamp": nonce
  };
  var options = {
    "method": "post",
    "headers": headers,
    "payload": payloadString,
    "muteHttpExceptions": true
  };
  var response = UrlFetchApp.fetch("https://api.crypto.com/v2/private/get-order-detail", options);
  var data = JSON.parse(response.getContentText());
  console.info(data)
  return data;
}

Насколько я понимаю, значение nonce должно увеличиваться при каждом запросе?

Хотя я не уверен, правильно ли я понял вашу текущую проблему, я предложил ответ. Пожалуйста, подтвердите это. Если я неправильно понял ваш вопрос, прошу прощения.

Tanaike 01.05.2023 10:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда я увидел официальный документ Crypto.com Spot Exchange V2.1 API для справочной документации Exchange,

nonce long Y Текущая метка времени (миллисекунды с эпохи Unix)

Кажется, что выборочное значение nonce равно 1587846358253.

Когда я увидел ваш скрипт, использующий new Date('2020-04-26T05:25:58.253Z'), 1587878748 возвращается как nonce. И в документе говорится о code: 10007, как 10007 400 INVALID_NONCE Nonce value differs by more than 30 seconds from server.

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

От:

var nonce = Math.floor(new Date().setSeconds(new Date().getSeconds() - 10) / 1000);

К:

var nonce = new Date().setSeconds(new Date().getSeconds() - 10);

или

var nonce = new Date().getTime();

или

var nonce = new Date().getTime().toString();

Примечание:

  • В этом ответе предполагается, что ваша другая часть, кроме nonce, правильно работает для использования API, который вы хотите использовать. Пожалуйста, будьте осторожны с этим.

Ссылка:

Добавлен:

Из вашего следующего ответа,

с изменением он дает код ошибки разрешения: 10002, сообщение: «НЕАВТОРИЗОВАННЫЙ» }. Я знаю, что ключи API верны.

Я могу подтвердить, что ваша проблема nonce в вашем вопросе была решена. Кроме того, я подтвердил, что ваш сценарий другой части, кроме nonce, неверен, и это ваша новая проблема. В этом случае, я думаю, что необходимо изменить ваш запрос. Я думаю, что ваш вопрос nonce этого вопроса может быть решен моим ответом. Итак, как насчет изменения вашего запроса следующим образом?

Модифицированный скрипт:

Функция signRequest взята из https://exchange-docs.crypto.com/spot/index.html#request-format.

function myFunction() {
  // Please set your valid values.
  const nonce = new Date().getTime();
  const id = "###"; // Please set your ID.
  const orderId = "###"; // Please set your order ID.
  const apiKey = "###"; // Please set your API key.
  const apiSecret = "###"; // Please set your secret.


  const signRequest = (request_body, api_key, secret) => {
    const { id, method, params, nonce } = request_body;
    function isObject(obj) { return obj !== undefined && obj !== null && obj.constructor == Object; }
    function isArray(obj) { return obj !== undefined && obj !== null && obj.constructor == Array; }
    function arrayToString(obj) { return obj.reduce((a, b) => { return a + (isObject(b) ? objectToString(b) : (isArray(b) ? arrayToString(b) : b)); }, ""); }
    function objectToString(obj) { return (obj == null ? "" : Object.keys(obj).sort().reduce((a, b) => { return a + b + (isArray(obj[b]) ? arrayToString(obj[b]) : (isObject(obj[b]) ? objectToString(obj[b]) : obj[b])); }, "")); }
    const paramsString = objectToString(params);
    console.info(paramsString);
    const sigPayload = method + id + api_key + paramsString + nonce;
    request_body.sig = Utilities.computeHmacSha256Signature(sigPayload, secret).map(byte => ('0' + (byte & 0xFF).toString(16)).slice(-2)).join('');
    return request_body;
  };

  let request = {
    id: id,
    method: "private/get-order-detail",
    api_key: apiKey,
    params: { order_id: orderId },
    nonce: nonce,
  };
  const requestBody = JSON.stringify(signRequest(request, apiKey, apiSecret));
  const options = {
    method: "post",
    contentType: "application/json",
    payload: requestBody,
  }

  var response = UrlFetchApp.fetch("https://api.crypto.com/v2/private/get-order-detail", options);
  var data = JSON.parse(response.getContentText());
  console.info(data)
  return data;
}

при изменении выдает код ошибки разрешения: 10002, message: 'UNAUTHORIZED' }. Я знаю, что ключи API верны.

utphx 02.05.2023 01:10

@utphx Спасибо за ответ. Из вашего ответа я могу подтвердить, что проблема nonce в вашем вопросе решена. Кроме того, я подтвердил, что ваш сценарий другой части, кроме nonce, неверен, и это ваша новая проблема. В этом случае, я думаю, что необходимо изменить ваш запрос. Я думаю, что ваш вопрос nonce этого вопроса может быть решен моим ответом. Итак, угадав запрос из документа, я добавил модифицированный скрипт. Пожалуйста, подтвердите это. К сожалению, я не могу протестировать этот API. Когда это не было полезно, я извиняюсь.

Tanaike 02.05.2023 02:26

Я просмотрел предоставленный вами код, и он решил проблему, спасибо.

utphx 03.05.2023 05:38

Другие вопросы по теме