- Регистрация
- 14.10.2021
- Сообщения
- 145
- Благодарностей
- 143
- Баллы
- 43
Спрашивал в телеграм канале , продублирую здесь.
Требуется авторизироваться в api zadarma .
Описание
Авторизация
Каждый запрос, который нуждается в авторизации, сопровождается дополнительным заголовком, вида:
"Authorization: ключ_пользователя: подпись"
Ключи для авторизации необходимо получить в личном кабинете.
Подпись составляется по следующему алгоритму:
массив из передаваемых параметров (GET, POST, PUT, DELETE) сортируется по названию ключа по алфавиту;
из полученного массива формируется строка запроса (например, функция http_build_query в PHP), пример "from=DATEFROM&to=DATETO…";
и далее - соединяется по формуле: строка = имя_метода строка_запроса md5( строка_запроса ), где "имя_метода" - строка запроса, начиная от домена (с указанием версии АПИ), до начала перечисления параметров, например - '/v1/sip/'
полученная строка хешируется по алгоритму sha1 с секретным ключом пользователя: хеш = hash( строка, секретный_ключ )
и далее хеш кодируется в base64 подпись = base64_encode( хеш )
Что сделано
Хеширование и преобразование взял на форуме
var input = project.Variables["text"].Value;
var secretKey = project.Variables["secret"].Value;
byte[] secretkeyBytes = Encoding.UTF8.GetBytes(secretKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
using (var hmac = new HMACSHA1(secretkeyBytes))
{
byte[] hashValue = hmac.ComputeHash(inputBytes);
return Convert.ToBase64String(hashValue);
}
Далее ( Спасибо участнику форума за подсказку ) - отправляю GET запрос c заголовками для авторизации
В итоге {"status":"error","message":"Not authorized"}
В "заголовках запроса "не видно запросов авторизации ( они должны быть?)
Есть рабочий код на PHP авторизации может кто поможет его конвертнуть в запроc на с# ?
$key = '___ВАШ KEY___' ;
$secret = '___ВАШ SECRET___' ;
$params = [];
$method = '/v1/info/balance/' ;
ksort($params);
$paramsStr = http_build_query( $params, null, '&', PHP_QUERY_RFC1738 );
$sign = base64_encode( hash_hmac('sha1', $method . $paramsStr . md5($paramsStr), $secret) );
$authHeader = 'Authorization: ' . $key . ':' . $sign;
$url = 'https://api.zadarma.com' ;
$options = array(
CURLOPT_URL => $url . $method,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => [$authHeader],
);
$ch = curl_init();
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
var_dump([
$response,
$error
]);
Буду признателен если укажите где может быть ошибка в запросе или переведёте в C# .Спасибо!
Требуется авторизироваться в api zadarma .
Описание
Авторизация
Каждый запрос, который нуждается в авторизации, сопровождается дополнительным заголовком, вида:
"Authorization: ключ_пользователя: подпись"
Ключи для авторизации необходимо получить в личном кабинете.
Подпись составляется по следующему алгоритму:
массив из передаваемых параметров (GET, POST, PUT, DELETE) сортируется по названию ключа по алфавиту;
из полученного массива формируется строка запроса (например, функция http_build_query в PHP), пример "from=DATEFROM&to=DATETO…";
и далее - соединяется по формуле: строка = имя_метода строка_запроса md5( строка_запроса ), где "имя_метода" - строка запроса, начиная от домена (с указанием версии АПИ), до начала перечисления параметров, например - '/v1/sip/'
полученная строка хешируется по алгоритму sha1 с секретным ключом пользователя: хеш = hash( строка, секретный_ключ )
и далее хеш кодируется в base64 подпись = base64_encode( хеш )
Что сделано
Хеширование и преобразование взял на форуме
var input = project.Variables["text"].Value;
var secretKey = project.Variables["secret"].Value;
byte[] secretkeyBytes = Encoding.UTF8.GetBytes(secretKey);
byte[] inputBytes = Encoding.UTF8.GetBytes(input);
using (var hmac = new HMACSHA1(secretkeyBytes))
{
byte[] hashValue = hmac.ComputeHash(inputBytes);
return Convert.ToBase64String(hashValue);
}
Далее ( Спасибо участнику форума за подсказку ) - отправляю GET запрос c заголовками для авторизации
В итоге {"status":"error","message":"Not authorized"}
В "заголовках запроса "не видно запросов авторизации ( они должны быть?)
Есть рабочий код на PHP авторизации может кто поможет его конвертнуть в запроc на с# ?
$key = '___ВАШ KEY___' ;
$secret = '___ВАШ SECRET___' ;
$params = [];
$method = '/v1/info/balance/' ;
ksort($params);
$paramsStr = http_build_query( $params, null, '&', PHP_QUERY_RFC1738 );
$sign = base64_encode( hash_hmac('sha1', $method . $paramsStr . md5($paramsStr), $secret) );
$authHeader = 'Authorization: ' . $key . ':' . $sign;
$url = 'https://api.zadarma.com' ;
$options = array(
CURLOPT_URL => $url . $method,
CURLOPT_CUSTOMREQUEST => 'GET',
CURLOPT_CONNECTTIMEOUT => 10,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_SSL_VERIFYPEER => false,
CURLOPT_SSL_VERIFYHOST => false,
CURLOPT_HTTPHEADER => [$authHeader],
);
$ch = curl_init();
curl_setopt_array($ch, $options);
$response = curl_exec($ch);
$error = curl_error($ch);
curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
var_dump([
$response,
$error
]);
Буду признателен если укажите где может быть ошибка в запросе или переведёте в C# .Спасибо!