Имя: Пароль:
1C
1С v8
JWT Токен. Тип Число в полезной нагрузке
0 gogn
 
13.02.23
10:59
Всем привет!

Столкнулся с проблемой относительно нового объекта ТокенДоступа, который формирует jwt токен.

Если использую такой код:
// формируем токен
Токен = Новый ТокенДоступа();
Токен.ПолезнаяНагрузка.Вставить("tst", 246);

То когда расшифровываю получившийся токен на https://jwt.io/ получаю:
{
  "tst": "246"
}

Т.е. число неявно преобразовалось в строку, а нужно вот так:
{
  "tst": 246
}

Есть идеи как этому помешать? Api, для которого я готовлю токен, требует именно тип число, в дате начала действия, в дате завершения, и строки не принимает.

Спасибо!
1 hockeyist
 
13.02.23
11:38
(0) Видимо, недоделали. Делайте токен самостоятельно
2 Проводкин
 
13.02.23
11:43
(0)  а если число  более 999 триады появятся  и пробелы в переводе в строку
3 gogn
 
13.02.23
12:16
(1) Есть хорошие варианты? dll может готовые или сервисы с доступным api?
4 hockeyist
 
13.02.23
12:32
(3) Не знаю. Я бы сам сделал. Быстрее выйдет, чем искать инструмент. Что там делать-то?  json+точка+json+подпись
5 hockeyist
 
13.02.23
12:33
json+точка+json+точка+подпись
6 gogn
 
13.02.23
12:37
(5) Зашифровать же надо json еще как-то, и из подписи там же не все берется.
7 hockeyist
 
13.02.23
13:49
(6) Зашифровать можно попробовать методом платформы
8 gogn
 
15.02.23
11:50
Платформа сама не умеет шифровать.
В общем решил так:
1. Формируем руками json, тупо как строки. Хеадер отдельно, пэйлоад отдельно.
2. И хеадер и пейлоад кодируем с помощью такого кода:
    Encoded = Base64Строка(ПолучитьДвоичныеДанныеИзСтроки(ПэйЛоад));     
    Encoded = СтрЗаменить(Encoded, "=", "");
    Encoded = СтрЗаменить(Encoded, "+", "-");
    Encoded = СтрЗаменить(Encoded, "/", "_");
    Encoded = СтрЗаменить(Encoded, Символы.ВК, "");
    Encoded = СтрЗаменить(Encoded, Символы.ПС, "");
    Encoded = СтрЗаменить(Encoded, "¶", "");

        ПэйЛоад = Encoded;

3. Собираем ИтоговаяСтрока = Хеадер + "." + ПэйЛоад;
4. Дальше хешируем и подписываем хеш с помощью библиотеки "System.Security.Cryptography.RSACryptoServiceProvider"

        RSACSP = Новый COMОбъект("System.Security.Cryptography.RSACryptoServiceProvider");
    RSACSP.FromXmlString(Ключ); // закрытый ключ в xml формате, можно получить из файла .pem на https://raskeyconverter.azurewebsites.net/PemToXml?handler=ConvertXML
    
    Хэширования = Новый ХешированиеДанных(ХешФункция.SHA256);
    Хэширования.Добавить(ИтоговаяСтрока);
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    Хэширования.ХешСумма.Записать(ИмяВременногоФайла);
    
    Поток = Новый COMОбъект("ADODB.Stream");
    Поток.Open();
    Поток.Type = 1;
    Поток.LoadFromFile(ИмяВременногоФайла);
    
    ДвоичныеДанные = Поток.Read(-1);;

    Поток.Close();
    Поток = Неопределено;
    
    Подпись = RSACSP.SignHash(ДвоичныеДанные, "SHA256");    
    RSACSP = Неопределено;
    
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла();

    Поток = Новый COMОбъект("ADODB.Stream");
    Поток.Open();
    Поток.Type = 1;
    Поток.Write(Подпись);
    Поток.SaveToFile(ИмяВременногоФайла, 1);
    Поток.Close();
    Поток = Неопределено;

    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяВременногоФайла);
    УдалитьФайлы(ИмяВременногоФайла);

    Encoded = Base64Строка(ДвоичныеДанные);
    Encoded = СтрЗаменить(Encoded, "=", "");
    Encoded = СтрЗаменить(Encoded, "+", "-");
    Encoded = СтрЗаменить(Encoded, "/", "_");
    Encoded = СтрЗаменить(Encoded, Символы.ВК, "");
    Encoded = СтрЗаменить(Encoded, Символы.ПС, "");
    Encoded = СтрЗаменить(Encoded, "¶", "");
    
    ПодписанныйТокен = ИтоговаяСтрока + "." + Encoded;

Пользуйтесь.
9 novichok79
 
15.02.23
12:19
погодите, ПолезнаяНагрузка = это типа payload по-русски.
прикольно, они там переводят.
10 gogn
 
16.02.23
06:42
(9) Да, прям так максимально дословно и перевели)
Закон Брукера: Даже маленькая практика стоит большой теории.