Вход | Регистрация
 

1с 8,2 и разбор токена Маркировки Честного знака

1с 8,2 и разбор токена Маркировки Честного знака
Я
   e053nk
 
06.11.20 - 10:54
Здравствуйте. Хочу получить срок жизни токена Честного знака (для автоматического запроса на генерацию нового токена). Из исходных данных: есть сам токен полученный от Честного знака  и Платформа 8.2,в которой нужно получить время жизни токена. Как я понимаю,сам токен состоит Этот токен содержит 3 части:
заголовок (Header)
{
  "alg": "HS256",
  "typ": "JWT"
}
данные (Payload)

{}
подпись (Signature)
Собственно в секции Payload и содержится время жизни токена.
При попытки запихать в Base64Значение(Токен)-исходный токен, мне возвращает с только первая секция: заголовок (Header). Остальное теряется при преобразовании.
Нашел пример на С#, там ребята просто строку между двумя точками выдернули и подсунули в метод С# Convert.FromBase64String. При этом они еще добавляют фиктивные данные в строку, если строка получается не полной для работы метода. Попробовал выдернуть только секцию данные (Payload) и подсунуть в Base64Значение -сразу получаю ошибку "Входная строка не является строкой в формате Base64". Т.е. где то что то теряется.
Онлайн декодировщики пробовал вставлять полный токен- декодирование проходит нормально; если только  секцию данные (Payload)-выдает ошибку "Входные данные не являются действительной строкой Base-64, поскольку содержат символ в кодировке, отличной от Base 64, больше двух символов заполнения или недопустимый символ среди символов заполнения". Как я понимаю нарушена структура строки base64.
СимволыПС и ВК -удалял, ошибки остаются.
Статей много нашел на тему декодирования, но они либо на свежие платформы 8.3 либо предлагают использовать внешние библиотеки. Хотелось бы реализацию стандартными методами 8.2 получить.
Может кто разъяснить как можно разобрать токен на строки?
   IVT_2009
 
1 - 06.11.20 - 11:37
начнем с этого

Функция РасшифроватьТокенJWT(Токен) Экспорт
    
    ВозвращаемоеЗначение = Новый Структура;
    ВозвращаемоеЗначение.Вставить("РезультатРасшифровки", Неопределено);
    ВозвращаемоеЗначение.Вставить("ТекстОшибки", "");
    
    ЭлементыТокена = _СтрРазделить(Токен, ".");
    Если ЭлементыТокена.Count() <> 3 Тогда
        ВозвращаемоеЗначение.ТекстОшибки = НСтр("ru = 'Токен не соответствует формату JWT'");
        Возврат ВозвращаемоеЗначение;
    КонецЕсли;
    
    ЭлементТокенаДанные = ЭлементыТокена[1];

    Данные = ТекстJSONВОбъект(
        ПолучитьСтрокуИзДвоичныхДанных(
            ДвоичныеДанныеЭлементаТокенаJWT(ЭлементТокенаДанные)));

    Возврат Данные;
    
КонецФункции
   IVT_2009
 
2 - 06.11.20 - 11:37
продолжим


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Функция ДвоичныеДанныеЭлементаТокенаJWT(Знач Значение)
    
    Значение = СтрЗаменить(Значение, "-", "+");
    Значение = СтрЗаменить(Значение, "_", "/");
    
    Остаток = СтрДлина(Значение) % 4;

    Если Остаток = 1 Тогда
        Возврат Неопределено;
    ИначеЕсли Остаток = 2 Тогда
        Значение = Значение + "==";
    ИначеЕсли Остаток = 3 Тогда
        Значение = Значение + "=";
    КонецЕсли;
    
    Возврат Base64Значение(Значение);
    
КонецФункции
   e053nk
 
3 - 06.11.20 - 12:36
(2)  ООО,сработало. У меня в коде не было вот этого:
    Значение = СтрЗаменить(Значение, "-", "+");
    Значение = СтрЗаменить(Значение, "_", "/");
я что то сам не нашел символы ,которые должны экранироваться.
И вот это:
Если Остаток = 1 Тогда
        Возврат Неопределено;
не понятно,почему должно возвращать Неопределено? По идеи должно быть Значение = Значение + "===";

Спасибо огромное,пойду допиливать дальше

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.