Помогите пройти авторизацию post-get запросами на сервисе Nicehash

TopFlow

Client
Регистрация
24.06.2020
Сообщения
59
Благодарностей
12
Баллы
8
коллеги добрый день!
Уже второй день пытаюсь разобраться как пройти авторизацию на сервисе Nicehash,
есть документация по АПИ:


но не как не могу разобраться с этими двумя пунктами:

X-Request-Id: (required, unique identifier of specific request, client should have local awareness that some app action should be done only once on server, if for some reason request is processed by server and client does not know anything about it (request failed). This ID will provide server information that it will not repeat action if it was already processed)

X-Auth: (API Key + ":" + HMAC signature, example: 4ebd366d-76f4-4400-a3b6-e51515d054d6:fb8484df7941a4d0c337939a73cc8fc09f50bd3309af5e1926baaee4d5059dfc)

Я так понимаю в первом случае просто генерим уникальное текстовое выражение, а вот с X-Auth - у меня конкретный затык...
Буду очень признателен за любую помощь!
 
  • Спасибо
Реакции: Livesferma

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
Вот тут есть примеры генерации HMAC signature на разных языках. Начать, наверное, можно оттуда.
 
  • Спасибо
Реакции: TopFlow

TopFlow

Client
Регистрация
24.06.2020
Сообщения
59
Благодарностей
12
Баллы
8
Вот тут есть примеры генерации HMAC signature на разных языках. Начать, наверное, можно оттуда.
Нашел на просторах такой код для генерации HMAC sha256 по тексту и ключу, не подскажите как его переделать и заставить работать в постере - заранее спасибо)

static string HMACHASH(string str, string key)
{
byte[] bkey = Encoding.Default.GetBytes(key);
using (var hmac = new HMACSHA256(bkey))
{
byte[] bstr = Encoding.Default.GetBytes(str);
var bhash = hmac.ComputeHash(bstr);
return BitConverter.ToString(bhash).Replace("-", string.Empty).ToLower();
}
}
 
Последнее редактирование:

nicanil

Client
Регистрация
06.03.2016
Сообщения
2 242
Благодарностей
1 804
Баллы
113
Нашел на просторах такой код для генерации HMAC sha256 по тексту и ключу, не подскажите как его переделать и заставить работать в постере - заранее спасибо)
Чтоб составить правильно HMAC signature данные надо упаковать определённым образом. По ссылке из моего прошлого сообщения есть готовая реализация, надо её только портировать в ZP. Я этого сейчас сделать не могу.
Возможно кто-то ещё увидит этот топик и поможет.
Можете создать тему в рекламном разделе.
 

Vital79

Client
Регистрация
14.04.2016
Сообщения
4
Благодарностей
0
Баллы
1
Чтоб составить правильно HMAC signature данные надо упаковать определённым образом. По ссылке из моего прошлого сообщения есть готовая реализация, надо её только портировать в ZP. Я этого сейчас сделать не могу.
Возможно кто-то ещё увидит этот топик и поможет.
Можете создать тему в рекламном разделе.
Подскажите как правильно упаковать данные. есть код. но он не выдает правильную сигнатуру. думаю проблема в разделителях. Два дня почти не сплю. ничего не выходит вот код
C#:
string result = project.Variables["kodiruem"].Value;
string secret = project.Variables["Api_secret"].Value;
string sha256 = string.Empty;

Func<string, string, string> Sha256 = delegate(string key, string data){
    string line = string.Empty;
    using (var hmc = new  System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(key))){
        line = Convert.ToBase64String(hmc.ComputeHash(Encoding.UTF8.GetBytes(data)));
    }
    return line;
};

return Sha256(secret, result); // Здесь дёргаем...
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
Подскажите как правильно упаковать данные. есть код. но он не выдает правильную сигнатуру. думаю проблема в разделителях. Два дня почти не сплю. ничего не выходит вот код
C#:
string result = project.Variables["kodiruem"].Value;
string secret = project.Variables["Api_secret"].Value;
string sha256 = string.Empty;

Func<string, string, string> Sha256 = delegate(string key, string data){
    string line = string.Empty;
    using (var hmc = new  System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(key))){
        line = Convert.ToBase64String(hmc.ComputeHash(Encoding.UTF8.GetBytes(data)));
    }
    return line;
};

return Sha256(secret, result); // Здесь дёргаем...
Этот код просто генерирует sha256 и конвертирует его в base64.

Вы уверены, что Вам именно это нужно?
Какие данные подаете на вход?
Что находится в kodiruem?
Что находится в Api_secret?
Какие данные ожидаете на выходе?
Точно необходимо в Encoding.UTF8, а не в Encoding.ASCII например?
На выходе должен быть SHA256 или base64 из sha256?

Если смотреть относительно документации, и взять ключи оттуда, то получится примерно такой код (результат совпадает с тем, что в документации).
Рабочий вариант относительно nicehash:
string[] array = new[]{
    "4ebd366d-76f4-4400-a3b6-e51515d054d6",
    "\x00",
    "1543597115712",
    "\x00",
    "9675d0f8-1325-484b-9594-c9d6d3268890",
    "\x00",
    "\x00",
    "da41b3bc-3d0b-4226-b7ea-aee73f94a518",
    "\x00",
    "\x00",
    "GET",
    "\x00",
    "/main/api/v2/hashpower/orderBook",
    "\x00",
    "algorithm=X16R&page=0&size=100"
};
string text = string.Join(string.Empty,array );
string API_Secret = "fd8a1652-728b-42fe-82b8-f623e56da8850750f5bf-ce66-4ca7-8b84-93651abc723b";
string API_Key = "4ebd366d-76f4-4400-a3b6-e51515d054d6";
string result = "21e6a16f6eb34ac476d59f969f548b47fffe3fea318d9c99e77fc710d2fed798"; // То что должно получиться

Func<string, string, string> Sha256 = delegate(string key, string data){
    string line = string.Empty;  
    using (var hmac = new  System.Security.Cryptography.HMACSHA256(Encoding.UTF8.GetBytes(key))){
            line =    string.Join(string.Empty, hmac.ComputeHash(Encoding.UTF8.GetBytes(data)).ToList().Select(b => b.ToString("x2")).ToArray());
    }  
    return line;
};

return string.Join(":", new[]{API_Key, Sha256(API_Secret, text)});
99185
 
Последнее редактирование:

Vital79

Client
Регистрация
14.04.2016
Сообщения
4
Благодарностей
0
Баллы
1
Если смотреть относительно документации, и взять ключи оттуда, то получится примерно такой код (результат совпадает с тем, что в документации).
Здравствуйте. Ваш код работает. И я даже подумал что все получится. GET запросы выполнялись. И я почти дописал проект. А когда очередь дошла до POST запроса для изменения цены ордера, все накрылось медным тазом. В документации написано:

Additionally, if REST endpoint requires a body it has to be included in input as an extra field prefixed by a delimiter:
  • Request body (example: {"test":true} )

Это входные данные пост запроса. Но их тоже я так понял нужно добавлять в код для создания HASH.
Я отправлял пост запрос через сайт. и через окно трафика делал кубик POST запроса. там можна увидеть параметр X-Auth который принимает сервер. Но подставив данные в скрипт видно что эта строка отличается. Я по разному пробовал добавить во входные данные скрипта эти дополнительные данные, но ничего не получилось.

Помогите правильно создать запрос POST. Пожалуйста.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
Здравствуйте. Ваш код работает. И я даже подумал что все получится. GET запросы выполнялись. И я почти дописал проект. А когда очередь дошла до POST запроса для изменения цены ордера, все накрылось медным тазом. В документации написано:

Additionally, if REST endpoint requires a body it has to be included in input as an extra field prefixed by a delimiter:
  • Request body (example: {"test":true} )

Это входные данные пост запроса. Но их тоже я так понял нужно добавлять в код для создания HASH.
Я отправлял пост запрос через сайт. и через окно трафика делал кубик POST запроса. там можна увидеть параметр X-Auth который принимает сервер. Но подставив данные в скрипт видно что эта строка отличается. Я по разному пробовал добавить во входные данные скрипта эти дополнительные данные, но ничего не получилось.

Помогите правильно создать запрос POST. Пожалуйста.
Попробуйте как-то так сформировать.
C#:
string[] array = new[]{
    "4ebd366d-76f4-4400-a3b6-e51515d054d6", // ключ
    "\x00",// разделитель
    "1543597115712", // время
    "\x00",// разделитель
    "9675d0f8-1325-484b-9594-c9d6d3268890", //nonce
    "\x00",// разделитель
    "\x00",// разделитель
    "da41b3bc-3d0b-4226-b7ea-aee73f94a518", // id
    "\x00",// разделитель
    "\x00",// разделитель
    "POST", // тип запроса
    "\x00",// разделитель
    "/main/api/v2/hashpower/orderBook", // ссылка
    "\x00", // разделитель
    "algorithm=X16R&page=0&size=100", // параметры
    "\x00",// разделитель
    "содержимое body POST запроса"
};
Вот на гитхабе говорится, что тело запроса должно быть подано последним, если оно есть:
99368
 

Vital79

Client
Регистрация
14.04.2016
Сообщения
4
Благодарностей
0
Баллы
1
Попробуйте как-то так сформировать.
Может тут дело в синтаксисе. Вот как правильно добавить в код эту строку. Точно такая строка передается на сервер

{"price":"0.4420","displayMarketFactor":"TH","marketFactor":"1000000000000"}
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
Может тут дело в синтаксисе. Вот как правильно добавить в код эту строку. Точно такая строка передается на сервер

{"price":"0.4420","displayMarketFactor":"TH","marketFactor":"1000000000000"}
Сначала формируете json примерно вот так, как показываю ниже.
А потом уже этот json подставляем в последний элемент массива, который был указан в предыдущем сообщении.
C#:
var dic = new Dictionary<string, object>();
dic["price"] = "0.4420";
dic["displayMarketFactor"] = "TH";
dic["marketFactor"] = "1000000000000";

string json = Global.ZennoLab.Json.JsonConvert.SerializeObject(dic,  Global.ZennoLab.Json.Formatting.None);
return json;
99372

C#:
string[] array = new[]{
    "4ebd366d-76f4-4400-a3b6-e51515d054d6", // ключ
    "\x00",// разделитель
    "1543597115712", // время
    "\x00",// разделитель
    "9675d0f8-1325-484b-9594-c9d6d3268890", //nonce
    "\x00",// разделитель
    "\x00",// разделитель
    "da41b3bc-3d0b-4226-b7ea-aee73f94a518", // id
    "\x00",// разделитель
    "\x00",// разделитель
    "POST", // тип запроса
    "\x00",// разделитель
    "/main/api/v2/hashpower/orderBook", // ссылка
    "\x00", // разделитель
    "algorithm=X16R&page=0&size=100", // параметры
    "\x00",// разделитель
   json
};
 
Последнее редактирование:
  • Спасибо
Реакции: Vital79 и one

Vital79

Client
Регистрация
14.04.2016
Сообщения
4
Благодарностей
0
Баллы
1
Сначала формируете json примерно вот так, как показываю ниже.
А потом уже этот json подставляем в последний элемент массива, который был указан в предыдущем сообщении.
Огромнейшее спасибо. Все работает и даже ордера создает четко.
Напишите кошелек Litecoin скину благодарность.
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
  • Спасибо
Реакции: Vital79

Livesferma

Новичок
Регистрация
22.10.2020
Сообщения
14
Благодарностей
2
Баллы
3
коллеги добрый день!
Уже второй день пытаюсь разобраться как пройти авторизацию на сервисе Nicehash,
есть документация по АПИ:


но не как не могу разобраться с этими двумя пунктами:

X-Request-Id: (required, unique identifier of specific request, client should have local awareness that some app action should be done only once on server, if for some reason request is processed by server and client does not know anything about it (request failed). This ID will provide server information that it will not repeat action if it was already processed)

X-Auth: (API Key + ":" + HMAC signature, example: 4ebd366d-76f4-4400-a3b6-e51515d054d6:fb8484df7941a4d0c337939a73cc8fc09f50bd3309af5e1926baaee4d5059dfc)

Я так понимаю в первом случае просто генерим уникальное текстовое выражение, а вот с X-Auth - у меня конкретный затык...
Буду очень признателен за любую помощь!
привет отпиши пожалуйста в тг livesferma
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)