Имя: Пароль:
1C
 
Авторизация в честном знаке новыми методами.
0 progaoff
 
14.02.24
15:59
Добрый день, подскажите, есть у кого пример реализации получения аутентификационного токена в ЧЗ по новым методам?


https://markirovka.sandbox.crptech.ru/api/v3/true-api/auth/simpleSignIn;
1 timurhv
 
14.02.24
16:07
Новый метод, это который 1-2 года уже по True API?


Функция Token(Запрос)
    
    АдресСервера = Запрос["ПараметрыЗапроса"].Получить("url");
    ИННОрганизации = Запрос["ПараметрыЗапроса"].Получить("inn");
    
    ДанныеТокена = Неопределено;
    АдресЗапросаКлючаСессии = "/api/v3/true-api/auth/key";
    HTTPСервисЗапрос = Новый HTTPСоединение(АдресСервера,,,,,60, Новый ЗащищенноеСоединениеopenSSL());
    Запрос = Новый HTTPЗапрос(АдресЗапросаКлючаСессии);
    Ответ = HTTPСервисЗапрос.Получить(Запрос);
    
    Если Ответ.КодСостояния = 200 Тогда
        ОтветСтруктура = ЗаполнитьСтруктуруИзОтветаJSON(Ответ.ПолучитьТелоКакСтроку());
        
        Сертификат = Константы.Токен_СертификатЭЦП.Получить();
        ПараметрыCMS = ЭлектроннаяПодписьСлужебныйКлиентСервер.ПараметрыCMS();
        ПараметрыCMS.Открепленная = Ложь;
        Данные = Новый Структура("Данные, ПараметрыCMS", ОтветСтруктура.data, ПараметрыCMS);
        
        АдресРезультата = Неопределено;
        ОшибкаНаСервере = Новый Структура;
        ПараметрыДляСервера = Новый Структура;
        ПараметрыДляСервера.Вставить("Операция", "Подписание");
        ПараметрыДляСервера.Вставить("ИдентификаторФормы",  Новый УникальныйИдентификатор);
        ПараметрыДляСервера.Вставить("СертификатВерен",     Истина);
        ПараметрыДляСервера.Вставить("СертификатПрограмма", Неопределено);
        ПараметрыДляСервера.Вставить("СертификатОтпечаток", Сертификат.Отпечаток);
        ПараметрыДляСервера.Вставить("ЭлементДанныхДляСервера", Новый Структура("Данные", ПоместитьВоВременноеХранилище(Данные)));
        ПараметрыДляСервера.Вставить("ТипПодписи",     Неопределено);
        ПараметрыДляСервера.Вставить("ТребуетсяПроверка", Ложь);
        ПараметрыДляСервера.Вставить("Комментарий",    "");
        ПараметрыДляСервера.Вставить("ЗначениеПароля", "");
        
        Успех = ЭлектроннаяПодписьСлужебныйВызовСервера.ВыполнитьНаСторонеСервера(ПараметрыДляСервера, АдресРезультата, Истина, ОшибкаНаСервере);
        
        Если Успех Тогда
            ПодписанныеДанные = ПолучитьИзВременногоХранилища(АдресРезультата);
            
            ПодписанныйФайл = ДвоичныеДанныеBase64(ПодписанныеДанные.Подпись);
            Тело = "{
            |""uuid"": """ + ОтветСтруктура.uuid + """,
            |""data"": """ + ПодписанныйФайл + """,
            |""inn"": """ + ИННОрганизации + """
            |}";
            
            АдресЗапросаКлючаСессии = "api/v3/true-api/auth/simpleSignIn";
            
            HTTPЗапрос = Новый HTTPЗапрос(АдресЗапросаКлючаСессии);
            HTTPЗапрос.Заголовки.Вставить("Content-Type","application/json;charset=UTF-8");
            HTTPЗапрос.УстановитьТелоИзСтроки(Тело);
            Ответ = HTTPСервисЗапрос.ОтправитьДляОбработки(HTTPЗапрос);
            СтруктураОтветJSON = ЗаполнитьСтруктуруИзОтветаJSON(Ответ.ПолучитьТелоКакСтроку());
            
            ДанныеТокена = Новый Структура();
            ДанныеТокена.Вставить("Отпечаток", Сертификат.Отпечаток);
            ДанныеТокена.Вставить("Токен",     СтруктураОтветJSON.token);
        КонецЕсли;
    КонецЕсли;
    
    Если ДанныеТокена <> Неопределено Тогда
        Ответ = Новый HTTPСервисОтвет(200);
        Ответ.УстановитьТелоИзСтроки(ОбщегоНазначения.ЗначениеВJSON(ДанныеТокена));
    Иначе
        Ответ = Новый HTTPСервисОтвет(402, СтроковыеФункции.СтрокаЛатиницей(ОшибкаНаСервере.ОписаниеОшибки));
    КонецЕсли;
    
    Возврат Ответ;
    
КонецФункции

Функция ЗаполнитьСтруктуруИзОтветаJSON(Знач ТекстJSON) Экспорт
    
    ЧтениеJSON = Новый ЧтениеJSON;
    ЧтениеJSON.УстановитьСтроку(ТекстJSON);
    Попытка
        Возврат ПрочитатьJSON(ЧтениеJSON);
    Исключение
        Возврат Неопределено;
    КонецПопытки;
    
КонецФункции

Функция ДвоичныеДанныеBase64(ДвоичныеДанные) Экспорт
    
    Base64 = Base64Строка(ДвоичныеДанные);
    Base64 = СтрЗаменить(Base64, Символы.ПС, "");
    Base64 = СтрЗаменить(Base64, Символы.ВК, "");
    
    Возврат Base64;
    
КонецФункции
2 timurhv
 
14.02.24
16:09
Это код из http-сервиса, подписание на стороне сервера. Нужно адаптировать под клиента (если ЭЦП у него стоит).
3 progaoff
 
14.02.24
16:16
(1) Да, это оно. Огромное Спасибо!
Независимо от того, куда вы едете — это в гору и против ветра!