авторизация в API

SERG454

Client
Регистрация
14.10.2021
Сообщения
144
Благодарностей
140
Баллы
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 заголовками для авторизации

84253




В итоге {"status":"error","message":"Not authorized"}

В "заголовках запроса "не видно запросов авторизации ( они должны быть?)


84254



Есть рабочий код на 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# .Спасибо!
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 362
Благодарностей
955
Баллы
113
Вставь там key и secretkey.
 

Вложения

  • Спасибо
Реакции: SERG454

SERG454

Client
Регистрация
14.10.2021
Сообщения
144
Благодарностей
140
Баллы
43
Последнее редактирование:

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 362
Благодарностей
955
Баллы
113
Спасибо , но чёт у меня опять не пошло... {"status":"error","message":"Not authorized"}
А ты что и куда вводишь? В кубиках двух первых key и secret key? Или сразу в переменные?
Прямо в шаблоне, который скинул, проверяешь? Или куда-то у себя попробовал повторить?
 
  • Спасибо
Реакции: SERG454

SERG454

Client
Регистрация
14.10.2021
Сообщения
144
Благодарностей
140
Баллы
43
А ты что и куда вводишь? В кубиках двух первых key и secret key? Или сразу в переменные?
Прямо в шаблоне, который скинул, проверяешь? Или куда-то у себя попробовал повторить?
прямо в шаблоне , в кубиках ( могу секреты в личку скинуть ) , в переменных видно значения - устанавливаются

и вот тут в коде выделенное - пробовал убирать , тож не идёт

var input = "/v1/info/balance/d41d8cd98f00b204e9800998ecf8427e";
var secretKey = project.Variables["secretKey"].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 BitConverter.ToString(hashValue).Replace("-", "").ToLower();
}
 

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 362
Благодарностей
955
Баллы
113
прямо в шаблоне , в кубиках ( могу секреты в личку скинуть ) , в переменных видно значения - устанавливаются

и вот тут в коде выделенное - пробовал убирать , тож не идёт

var input = "/v1/info/balance/d41d8cd98f00b204e9800998ecf8427e";
var secretKey = project.Variables["secretKey"].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 BitConverter.ToString(hashValue).Replace("-", "").ToLower();
}
Пиши в личку ))) Или лучше в телегу
 
  • Спасибо
Реакции: SERG454

SERG454

Client
Регистрация
14.10.2021
Сообщения
144
Благодарностей
140
Баллы
43
Решено , не работало с режимом"альтернативные запросы" в настройках зенки. Moonwalker огромнейшее спасибо!
 
  • Спасибо
Реакции: Moonwalker

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 362
Благодарностей
955
Баллы
113
Решено , не работало с режимом"альтернативные запросы" в настройках зенки. Moonwalker огромнейшее спасибо!
Ну и отлично. Пусть шаблон лежит, уверен, еще кому пригодится. Я год назад тоже, помню, помучился )))
В ответ приму шаблон, который по API может снять баланс аккаунта Яндекс.Директ ("приложения" созданы, директ туда добавлен) ))) Каждый раз подхожу, копаюсь, плюю в итоге )))
 

braind

Client
Регистрация
10.10.2012
Сообщения
119
Благодарностей
11
Баллы
18

Moonwalker

Client
Регистрация
16.03.2016
Сообщения
1 362
Благодарностей
955
Баллы
113
аналогичный затык, подскажи плиз как решается.
В твоем шаблоне все работает, но если менять запрос на проверку баланса, то не работает :(
А режим запросов в настройке зенки менял? Выше писали, что с альтернативными не работал у человека.
 

zarufakis

Client
Регистрация
22.03.2019
Сообщения
1 525
Благодарностей
883
Баллы
113
Я с авторизацией решаю вопрос так.
1. Открываю в браузере зенки http://ya.ru
2. В трафике из GET запроса со статусом "200", правой кнопкой создаю действие из запроса
3. Меняю ссылку на свою
4. Во вкладке Дополнительно добавляю "Authorization: ключ_пользователя: подпись"

В 99% случаях работает без напильника.
 

sergio197675

Client
Регистрация
21.09.2019
Сообщения
360
Благодарностей
317
Баллы
63
Я с авторизацией решаю вопрос так.
1. Открываю в браузере зенки http://ya.ru
2. В трафике из GET запроса со статусом "200", правой кнопкой создаю действие из запроса
3. Меняю ссылку на свою
4. Во вкладке Дополнительно добавляю "Authorization: ключ_пользователя: подпись"

В 99% случаях работает без напильника.
это если ключ не шифруется, как в условиях задармы
 

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