Получение авторизационного токена Диадок
Добрый день.
Стоит задача, настроить интеграцию с Диадок посредством HTTP-запросов.
Ключ разработчика есть, API оплачен - через компоненту все работает.
При попытке получения авторизационного токена приходит код состояния 400 с ответом "Could not deserialize certificate from the request body".
Ткните, пожалуйста, что я делаю не так, и как надо сделать, чтобы заработало?
Стоит задача, настроить интеграцию с Диадок посредством HTTP-запросов.
Ключ разработчика есть, API оплачен - через компоненту все работает.
При попытке получения авторизационного токена приходит код состояния 400 с ответом "Could not deserialize certificate from the request body".
Менеджер = Новый МенеджерКриптографии("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider","",75);
Хранилиище = Менеджер.ПолучитьХранилищеСертификатов(ТипХранилищаСертификатовКриптографии.ПерсональныеСертификаты,РасположениеХранилищаСертификатовКриптографии.ДанныеКомпьютера);
Сертификаты = Хранилиище.ПолучитьВсе();
Сертификат = Сертификаты[0];
ДД = Сертификат.Выгрузить();
Запрос = Новый Запрос;
Запрос.Текст = "выбрать ApiClientId как ключ
|из справочник.автомирпользователидиадок
|где код = ""!Группа 1""";
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
КлючРазработчика = Выборка.Ключ;
КонецЕсли;
Запрос = Неопределено;
Соединение = Новый HTTPСоединение("diadoc-api.kontur.ru",,,,,,Новый ЗащищенноеСоединениеOpenSSL());
Запрос = Новый HTTPЗапрос("/v3/Authenticate?type=certificate");
Запрос.Заголовки.Вставить("POST /v3/Authenticate?type=certificate HTTP/1.1");
Запрос.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
Запрос.Заголовки.Вставить("Content-Type", "octet-stream");
Запрос.Заголовки.Вставить("Content-Length", "1252");
Запрос.Заголовки.Вставить("Connection", "Keep-Alive");
Запрос.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id=" + КлючРазработчика);
Запрос.УстановитьТелоИзДвоичныхДанных(ДД);
Попытка
//Ответ = Соединение.ОтправитьДляОбработки(Запрос);
ФайлРезультата = ПолучитьИмяВременногоФайла();
Соединение.ОтправитьДляОбработки(Запрос, ФайлРезультата);
Ответ = Новый ТекстовыйДокумент();
Ответ.Прочитать(ФайлРезультата, КодировкаТекста.UTF8);
СтрокаОтвета = Ответ.ПолучитьТекст();
Исключение
Сообщить(ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки; ПоказатьТкните, пожалуйста, что я делаю не так, и как надо сделать, чтобы заработало?
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(2) Какие двоичные данные я только ни пытался передать в тело запроса - ответ тот же.
В документации только так написано: 400 Bad Request – данные в запросе имеют неверный формат или отсутствуют обязательные параметры.
Тех поддержка диадока попросила у меня файл открытого сертификата, проверила запрос с помощью, вероятно, postman и прислала скрин, что все ок, ответ 200. А дальше, говорят разбирайтесь сами, что вы там в тело запроса передаете.
В общем, на мой вопрос они так и не ответили. На гитхабе тоже тишина. Я уже просто не понимаю, что именно нужно передать и откуда это взять.
В документации только так написано: 400 Bad Request – данные в запросе имеют неверный формат или отсутствуют обязательные параметры.
Тех поддержка диадока попросила у меня файл открытого сертификата, проверила запрос с помощью, вероятно, postman и прислала скрин, что все ок, ответ 200. А дальше, говорят разбирайтесь сами, что вы там в тело запроса передаете.
В общем, на мой вопрос они так и не ответили. На гитхабе тоже тишина. Я уже просто не понимаю, что именно нужно передать и откуда это взять.
(1) Немного некропостинг, но вдруг кто столкнулся с таким же:
Получал такую же ошибку, когда пытался получать ответ как строку (надо как ДД). Кажется здесь такая же ошибка.
НастройкиПодключения это структура с логинами, паролями и т.д. (в данном случае нужен только API-ключ).
ДанныеСертификата - просто ДД сертификата
// Соединяется по сертификату и возвращает токен
//
// Параметры:
// НастройкаПодключения - см. НовыеНастройкиПодключения
// ДанныеСертификата - ДвоичныеДанные - Двоичное DER-представление X.509-сертификата пользователя
//
// Возвращаемое значение:
// Строка - Токен
//
Функция СоединитьсяНаСервереПоСертификату(НастройкаПодключения, ДанныеСертификата) Экспорт
КлючРазработчика = НастройкаПодключения.APIКлюч;
// Чтобы использовать v3 версию надо потом будет вызывать AuthenticateConfirm
//АдресРесурса = "/V3/Authenticate?type=certificate";
АдресРесурса = "/Authenticate?type=certificate";
АдресСайта = Сервер();
HTTPЗапрос2 = Новый HTTPЗапрос;
HTTPЗапрос2.Заголовки.Вставить("POST "+АдресРесурса+" HTTP/1.1");
HTTPЗапрос2.Заголовки.Вставить("Host", "diadoc-api.kontur.ru");
HTTPЗапрос2.Заголовки.Вставить("Content-Type", "application/octet-stream");
HTTPЗапрос2.Заголовки.Вставить("Accept", "application/json");
HTTPЗапрос2.Заголовки.Вставить("Authorization", "DiadocAuth ddauth_api_client_id="+КлючРазработчика);
HTTPЗапрос2.АдресРесурса = АдресРесурса;
HTTPЗапрос2.УстановитьТелоИзДвоичныхДанных(ДанныеСертификата);
Соединение = Новый HTTPСоединение(АдресСайта,,,,, 10, Новый ЗащищенноеСоединениеOpenSSL(),Ложь);
Ответ = Соединение.ОтправитьДляОбработки(HTTPЗапрос2);
ТелоОтвета = Ответ.ПолучитьТелоКакДвоичныеДанные();
МенеджерКриптографии = Новый МенеджерКриптографии("", "", 80);
ТокенСтрокой = Base64Строка(МенеджерКриптографии.Расшифровать(ТелоОтвета, Новый СертификатКриптографии(ДанныеСертификата)));
ТокенСтрокой = СтрЗаменить(ТокенСтрокой, Символы.ВК, "");
ТокенСтрокой = СтрЗаменить(ТокенСтрокой, Символы.ПС, "");
Возврат ТокенСтрокой;
КонецФункции ПоказатьПолучал такую же ошибку, когда пытался получать ответ как строку (надо как ДД). Кажется здесь такая же ошибка.
НастройкиПодключения это структура с логинами, паролями и т.д. (в данном случае нужен только API-ключ).
ДанныеСертификата - просто ДД сертификата
(10) Версия КриптоПро 4.0.9963.
Вы хотите сказать, что дело в "GOST R 34.10-2001"? Это я брал из интернетов, вполне возможно, что и что-то устаревшее.
Попробовал поменять на 34.10-2012, упала ошибка "Ошибка при получении контекста модуля криптографии"
Вы хотите сказать, что дело в "GOST R 34.10-2001"? Это я брал из интернетов, вполне возможно, что и что-то устаревшее.
Попробовал поменять на 34.10-2012, упала ошибка "Ошибка при получении контекста модуля криптографии"
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот