Что такое HMAC и JWT и как это использовать в 1С

Публикация № 611505

Разработка - Системная интеграция - Внешние источники данных

HMAC JWT Twilio DocumentDB

Лёгкая статья про стандарты HMAC и JWT с небольшой теорией и исходным кодом.

Лёгкая статья про стандарты HMAC и JWT с небольшой теорией и исходным кодом.

Коллеги, позвольте вам рассказать о вещах, которые далеки от обычной разработки в 1С.

Вероятно, что сейчас у вас нет необходимости использовать HMAC и JWT, но время не стоит на месте, и, возможно, в очередном проекте интеграции вы задействуете описываемые ниже стандарты.

Часть первая, теоретическая.

HMAC (Hash-based message authentication code) - это хэш, который вычисляется, основываясь на двух значениях: 'ключ' и 'сообщение'. Такой хэш нужен, чтобы гарантировать, что данные, передаваемые в ненадежной среде, не были изменены посторонними лицами.

Зачем же нам использовать HMAC, когда у нас есть, например, HTTPS?

HMAC полезен, когда участников в обмене сообщениями больше, чем два.

Например, у нас есть три участника:

  •  'Провайдер API' - сторонний сервис, который принимает запросы на отправку открыток и букетов
  •  'Сервер' - серверная часть вашего приложения
  •  'Клиент' - клиентская часть, с которой работают пользователи

'Провайдер API' предоставляет две вещи для выполнения запросов – это AccounID и SecretKey. 'Провайдер API' ни чего не знает про ваших пользователей, чтобы принять запрос на отправку открытки, ему нужно удостовериться, что просящий знает AccounID и SecretKey.

'Сервер' в свою очередь должен управлять тем, какие пользователи имеют право отправлять букеты, а каким разрешены только открытки.

Разумеется, очевидное решение задачи заключается в том, чтобы все клиентские запросы направить через 'Сервер':

  1.  'Клиент' - формирует запрос на отправку открытки для 'Сервера';
  2.  'Сервер' - проверяет права конкретного пользователя и если всё хорошо, то перенаправляет вызов на 'Провайдера API';
  3.  'Провайдер API' делает необходимые действия;
  4. Далее по цепочке обратно передается результат вызова.

Но что, если у нас клиенты генерируют десятки тысяч таких запросов, и не хотят долго ждать результат выполнения? Или наши запросы содержат потоковое аудио (для музыкальных открыток), которым не хотелось бы грузить 'Сервер'? Более того, а что, если 'Клиент' передает конфиденциальные сведения, которые и вовсе не должны попасть на 'Сервер' (букет с интимным посланием)?
Почему бы нам сразу не слать запросы с 'Клиента' на 'Провайдер API'?

Тогда нам придется 'Клиенту' сообщить AccounID и SecretKey, которые нужны 'Провайдеру API'. Но поскольку у нас разные клиенты имеют разные права (открытки, букеты) и в какой то момент у клиента права могут быть и вовсе отозваны, то мы не можем сообщать 'Клиенту' AccounID и SecretKey.
В этот момент нам и пригодится HMAC.
Благодаря HMAC мы можем построить работу следующим образом:

  1. 'Клиент' запрашивает у 'Сервера' специальный Token
  2. 'Сервер' делает Token с помощью HMAC, учитывая права пользователя и ограничивая действие токена по времени:
Token = HMAC(SecretKey, AccounID + ПравоПользователя + ДатаВремяДоступа)

Теперь пользователь может обратиться напрямую к 'Провайдеру API' за конкретной услугой и предоставить Token, AccounID и ДатаВремяДоступа. 'Провайдер API' вычисляет Token и сверяет его с тем, что прислал 'Клиент' и той услугой которую 'Клиент' хочет получить.

В данной схеме 'Клиент' является той самой ненадежной средой. Фактически запрос должен делать 'Сервер', потому что 'Провайдер API' сказал свой SecretKey только 'Серверу'. Но наш 'Сервер' не хочет делать запросы и разрешает на время 'Клиенту' самостоятельно делать запросы. Наш 'Сервер' не доверяет 'Клиенту' и использует HMAC, чтобы обеспечить неизменность выданных разрешений на использование услуг 'Провайдера API'.


Часть вторая, считаем HMAC.

Давайте посмотрим под капот и узнаем, что же внутри функции HMAC.

Функция HMAC на вход принимает SecretKey и Message типа ДвоичныеДанные и вид хэш функции.

Function HMAC(Val SecretKey, Val Message, Val HashFunc) Export

	BlSz = 64;
	
	// Если ключ больще чем размер блока, то в качестве ключа используем хэш от ключа
	If SecretKey.Size() > BlSz Then
		SecretKey = Hash(SecretKey, HashFunc);
	EndIf;
	
	EmptyBin = GetBinaryDataFromString("");
	SecretKey = BinLeft(SecretKey, BlSz);
	
	// Если ключ меньше блока, то добиваем его нулями до размера блока
	К0 = BinRightPad(SecretKey, BlSz, "0x00");
	
	// Делаем k_ipad, выполняем операцию «побитовое исключающее ИЛИ» ключа c константой 0x36
	ipad = BinRightPad(EmptyBin, BlSz, "0x36");
	k_ipad = BinBitwiseXOR(К0, ipad);
	
	// Делаем k_opad, выполняем операцию «побитовое исключающее ИЛИ» ключа c константой 0x5c
	opad = BinRightPad(EmptyBin, BlSz, "0x5C");
	k_opad = BinBitwiseXOR(К0, opad);
	
	// склеиваем k_ipad и сообщение
	k_ipad_Message = BinConcat(k_ipad, Message);
	
	// вычисляем хэши и получаем результат
	k_opad_Hash = BinConcat(k_opad, Hash(k_ipad_Message, HashFunc));
	res = Hash(k_opad_Hash, HashFunc);
	
	Return res;

EndFunction

Функции BinLeft, BinRightPad, BinBitwiseXOR и BinConcat реализованы с использованием возможностей платформы, которые появились в версии 8.3.10.2168.

Теперь мы можем делать хэш и комбинировать данные для подписи любым способом.

Например, так:

Token = HMAC(SecretKey, AccounID + ПравоПользователя + УникальныйИдентификатор + "допДанные7" + ДатаВремяДоступа + ИмяПользователя)

Такая свобода действий может породить хаос и как следствие – увеличение сроков разработки и интеграции. Что, если бы у нас был стандарт, по которому определен формат для сообщений?

Такой стандарт у нас есть, и называется он JWT.


Часть третья, пару слов про JWT

JWT (JSON Web Token) – это стандарт, по которому определено, в каком виде будет выглядеть токен для клиента. По сути JWT это строка, состоящая из трех частей соединенных точками: заголовок, данные и подпись.

Например: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Этот токен содержит:

заголовок (Header)

{
  "alg": "HS256",
  "typ": "JWT"
}

данные (Payload)

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}

и подпись (Signature):

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

Польза от JWT в том, что это стандарт и для этого стандарта уже готовы библиотеки на всевозможных платформах.

К этой статье приложена реализация JWT на чистом 1C:Enterprise 8.3.10.2168.


Например, вы делаете интеграцию со сторонним сервисом, и вам необходимо договорится об авторизации запросов от пользователей. С большой вероятностью сторонний сервис реализован на платформе, для которой есть готовая библиотека JWT. Вы как прогрессивный разработчик 1С теперь можете предложить использовать стандарт RFC 7519 – т.е. JWT. Каждый со своей стороны возьмет готовую библиотеку и вуаля – пользователи ходят напрямую в сторонний сервис.

 

Заключение

Благодарю, что прочитали эту статью. Надеюсь, вы нашли для себя полезное.

Пожалуйста, напишите в комментариях, как по вашему мнению можно было бы использовать JWT в мире 1С уже сейчас.

Любые, возможно бредовые, идеи принимаются. Например: отправка whatsapp-сообщений прямо из тонкого клиента.

Скачать файлы

Наименование Файл Версия Размер
Конфигурация содержащая код для работы с HMAC и JWT

.cf 22,45Kb
28.01.19
124
.cf 1.2 22,45Kb 124 Скачать

Специальные предложения

Лучшие комментарии
1. davdykin 25 21.04.17 21:42 Сейчас в теме
Спасибо за информацию, учитывая популярность микросервисов думаю может вполне пригодиться.
o.nikolaev; warliker; stilet; ponkratov; keypax; DrAku1a; +6 Ответить
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. davdykin 25 21.04.17 21:42 Сейчас в теме
Спасибо за информацию, учитывая популярность микросервисов думаю может вполне пригодиться.
o.nikolaev; warliker; stilet; ponkratov; keypax; DrAku1a; +6 Ответить
2. stas1976 14 26.04.17 11:23 Сейчас в теме
3. NcSteel 04.05.17 20:58 Сейчас в теме
Подскажите, пожалуйста, вариацию если в качестве соли используется не строковый ключ, а сертификат
4. user757186 29.06.17 19:49 Сейчас в теме
(3) функции хэширования и подписи работают с двоичными данными, строки - это лишь частный случай двоичных данных. Если вы посмотрите внимательно код - там нет фукнкций работы со строками, там используются функции работы с двоичными данными.
5. pbazeliuk 1767 17.10.17 10:19 Сейчас в теме
Для MD5 и SHA-1 у вас не верный размер блока, он должен быть 64. Можете проверить в любом онлайн генераторе.
7. keypax 103 18.10.17 10:51 Сейчас в теме
6. pbazeliuk 1767 17.10.17 11:36 Сейчас в теме
И последнее, если ключ больше размера блока, его необходимо предварительно хешировать
8. keypax 103 26.10.17 18:11 Сейчас в теме
(6) Обновил код по вашим замечаниям. Благодарю, что нашли ошибки.
9. moro_as 17.02.18 06:31 Сейчас в теме
задача в интеграции с https://docs.veeroute.com/api/examples/json_examples/
есть что-то общее между JWT?
застрял на функции getBytes() какой аналог в 1с (двоичные данные?)
направьте куда копать.
10. keypax 103 18.02.18 09:52 Сейчас в теме
(9) да
в строчке
byte[] passBytes = password.getBytes();

по всей видимости следует использовать глобальный метод ПолучитьДвоичныеДанныеИзСтроки (GetBinaryDataFromString)

Затем вам нужно будет конвертировать массив в двоичные данные
byte[] saltBytes = listToArray(ticket.getSalt());

Для этого вам понадобится объект ЗаписьДанных (DataWriter)
и метод ЗаписатьБайт (WriteByte)

Далее нужно будет соеденить passBytes, saltBytes и вычислить хэш
byte[] PaS = makeBytesHash(concatenateByteArrays(passBytes, saltBytes), "SHA-512");


Для соединения passBytes, saltBytes используйте функцию из статьи
Function BinConcat(Val BinaryData1, Val BinaryData2)


А вот с хэшем беда.
В 1С есть только хэш-функции
CRC32
MD5
SHA1
SHA256

Поэтому ищем в интернете варианты. Например в этой статье есть два подхода для получения SHA-512:
https://infostart.ru/public/175332/

Осталось только полученный хэш конвертировать в массив - для этого используйте объект ЧтениеДанных (DataReader).
11. moro_as 19.02.18 11:29 Сейчас в теме
(10) Спасибо огромное!!!
Затем вам нужно будет конвертировать массив в двоичные данные
byte[] saltBytes = listToArray(ticket.getSalt());

Для этого вам понадобится объект ЗаписьДанных (DataWriter)
и метод ЗаписатьБайт (WriteByte)


Функция listToArray(Знач Массив) Экспорт
	Перем Результат;
	ПотокВПамяти = Новый ПотокВПамяти();
	ЗаписьДанных = Новый ЗаписьДанных(ПотокВПамяти);	
	Для Каждого Элемент из Массив Цикл
		ЗаписьДанных.ЗаписатьБайт(Число(Элемент));
	КонецЦикла;
	Результат = ПотокВПамяти.ЗакрытьИПолучитьДвоичныеДанные();
	Возврат Результат;
КонецФункции
Показать


ЗаписатьБайт выдаёт ошибку:
по причине:
Значение байта должно быть в диапазоне от 0 до 255,
а в передаваемом массиве [-100,-96,20,51,89,-47,-80,-128,86,43,-24,124,-109,12,47] есть элементы с минусовым значением...
12. moro_as 19.02.18 13:29 Сейчас в теме
(11) Оказывается байт java (-127...128), вот и вся ошибка.
13. moro_as 19.02.18 19:11 Сейчас в теме
(10)
Для соединения passBytes, saltBytes используйте функцию из статьи
Function BinConcat(Val BinaryData1, Val BinaryData2)

штатным образом можно получить через СоединитьДвоичныеДанные
14. moro_as 19.02.18 23:10 Сейчас в теме
(10)
А вот с хэшем беда.
В 1С есть только хэш-функции
CRC32
MD5
SHA1
SHA256

Поэтому ищем в интернете варианты. Например в этой статье есть два подхода для получения SHA-512:
https://infostart.ru/public/175332/


Да, действительно беда.
Но можно и вот так попробовать:

Функция CryptoSHA512(Строка) Экспорт 
	Текст = Новый COMОбъект("System.Text.UTF8Encoding");
	КриптоSHA512 = Новый COMОбъект("System.Security.Cryptography.SHA512Managed");
	Байты = Текст.GetBytes_4(Строка); 
	МассивХэш = КриптоSHA512.ComputeHash_2(Байты).Выгрузить();
	Возврат МассивХэш;
КонецФункции
Показать
15. Varsaavius 18.05.18 12:28 Сейчас в теме
При использовании алгоритма RS256, при декодировании постоянно не совпадают сигнатуры. /:
16. pallid 240 16.01.19 10:34 Сейчас в теме
Подскажите есть ли замена платформенного метода Buffer1.WriteBitwiseXor(0, Buffer2, Buffer2.Size) на аналог
Function BinBitwiseXOR(Val BinaryData1, Val BinaryData2)
	
	MemoryStream = New MemoryStream();
	DataWriter = New DataWriter(MemoryStream);
	
	DataReader1 = New DataReader(BinaryData1);
	DataReader2 = New DataReader(BinaryData2);
	
	Buffer1 = DataReader1.ReadIntoBinaryDataBuffer();
	Buffer2 = DataReader2.ReadIntoBinaryDataBuffer();
	
	If Buffer1.Size > Buffer2.Size Then
		Buffer1.WriteBitwiseXor(0, Buffer2, Buffer2.Size);
		DataWriter.WriteBinaryDataBuffer(Buffer1);
	Else 
		Buffer2.WriteBitwiseXor(0, Buffer1, Buffer1.Size);
		DataWriter.WriteBinaryDataBuffer(Buffer2);
	EndIf;
	
	res = MemoryStream.CloseAndGetBinaryData();
	Return res;

EndFunction

Показать
17. keypax 103 25.01.19 10:48 Сейчас в теме
(16) К сожалению, у меня нет готового кода, которы бы заменял метод WriteBitwiseXor
18. frkbvfnjh 592 28.01.19 15:21 Сейчас в теме
Выдает ошибку:
Процедура или функция с указанным именем не определена (ValueIsNotFilled)
21. keypax 103 28.01.19 16:42 Сейчас в теме
(18)
Пожалуйста добавьте метод
Function ValueIsNotFilled(Value) Export

	Return Not ValueIsFilled(Value);

EndFunction
19. frkbvfnjh 592 28.01.19 15:33 Сейчас в теме
Блин капец:
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "DecodeHS256"
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "DecodeRS256"
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "EncodeHS256"
Обработка.HMAC_JWT.Форма.Form.Форма Возможно ошибочный метод: "EncodeRS256"
Нет таких функций!
Вы бы перепроверили все. И раз уж на то пошло, то выкладывали бы сразу все в виде одного файла демонстрационной конфигурации или все функции в обработку засунули, а не кучу разрозненных файлов
22. keypax 103 28.01.19 17:13 Сейчас в теме
(19) код скаченных модулей Cryptography и JWT рабочий.
Демонстрационная обработка использует интерфейс от несколько обновленного модуля JWT.
В связи с этим обновил публикацию - залил последнюю версию модуля JWT.
Прошу прощения за неудобства.

Вышлю вам последнюю версию в ЛС.
26. frkbvfnjh 592 29.01.19 14:17 Сейчас в теме
(22) Спасибо большое! Теперь все работает.
20. frkbvfnjh 592 28.01.19 15:36 Сейчас в теме
Я так понимаю есть только Encode и Decode и кодирование производится только по алгоритму SHA256. Все верно?
23. keypax 103 28.01.19 17:22 Сейчас в теме
(20) средствами 1С реализован только алгоритм HS256. Для алгоритма RS256 я использовал COM-объект из сторонней библиотеки.
24. frkbvfnjh 592 29.01.19 05:59 Сейчас в теме
(23) Хорошо, но из обработки идет вызов функций которых нет в общих модулях, это сбивает с толку. Тогда переименовали бы в общем модуле функции в функции с префиксом HS256, а для RS256 сделали бы "заглушку" с комментариями. Или переименуйте вызываемые функции в самой обработке, удалите те, которых нет на самом деле. Да и было бы отлично, если привести готовый код для RS256 который вы использовали при работе со сторонней библиотекой, я думаю никто бы не огорчился, а только благодарны были бы. А то начинаешь сомневаться в том правильно ли все понял, отнимает время что бы разобраться что к чему и как правильно пользоваться.
38. mcOrk 23.10.19 11:47 Сейчас в теме
А можно получить данную библиотеку? Не получилось найти на просторах интернета. Спасибо.
39. keypax 103 23.10.19 13:13 Сейчас в теме
(38) Да, конечно. В конце статьи есть кнопка "Скачать". Используйте, пожалуйста, её.
40. mcOrk 23.10.19 16:17 Сейчас в теме
(39) CF скачал, но я имел ввиду про стороннюю библиотеку, используемую Вами "AddIn.RSAUtils" Отдельной ссылки нигде не нашел.
41. keypax 103 23.10.19 17:38 Сейчас в теме
(40) по поводу AddIn.RSAUtils - напишите, мне пожалуйста на почту vasily@pintov.ru
42. donyab 10 17.12.19 12:59 Сейчас в теме
(40)
(41)
Аналогичная ситуация, я так понимаю это что то самописное, может его приложить в пример к статье?
Первое что выдает гугл при поиске RSAUtils - это вирус шифровальщик)
25. frkbvfnjh 592 29.01.19 06:19 Сейчас в теме
В целом публикация хорошая. Написанная Вами библиотека функций очень нужная!
27. frkbvfnjh 592 29.01.19 14:18 Сейчас в теме
28. kloze 14.05.19 11:22 Сейчас в теме
Подскажите почему не работает. Сейчас HMAC получаю так

<?php 
$p_sign = hash_hmac('sha1', '811576.003RUB8290666011119https://www.test.ru2014052019110700003430', pack('H*', '3716699F804BE05E9E8D767ACEB6B88E')); 
echo $p_sign  
?>


HMAC = 7a619c6b8f79b95fc359a990075d6aeb2f6a6965

А через эту обработку получает 9E83F1A022F0F916580132CA54639DA576E573BC
29. keypax 103 14.05.19 11:55 Сейчас в теме
30. malikov_pro 553 04.10.19 20:31 Сейчас в теме
А можете ли Вы (автор) сделать реализацию pbkdf2? Тема Вам близка а реализации под 1C не нашел.
31. keypax 103 07.10.19 11:00 Сейчас в теме
(30) Я бы с удовольствием. К сожалению, не понимаю для каких практических задач нужен pbkdf2 в 1С. Например HMAC нужен был для интеграции с Twilio. И чтобы избавится от обращения к COM-объекту был реализован JWT и HMAC средствами платформы.
Для каких реальных задач вы видите необходимость в реализации pbkdf2?
32. malikov_pro 553 07.10.19 11:57 Сейчас в теме
(31)
1. Передача данных для проверки PIN кодов в удаленной системе (сейчас партнер передает Base64 строку с хешем солью и параметрами, из за отсутствия реализации проверяем через его API, сначала планировалось локально).
2. Хранение паролей для внешних пользователей, куча решений когда внешних пользователей хранят как обычных. Я в решениях хранил в отдельном справочнике и по простому хешировал пароль.
33. keypax 103 07.10.19 15:59 Сейчас в теме
(32) По второму кейсу в простого хэша может быть и достаточно.
По первому кейсу конечно нужна реализация pbkdf2.
Не могу обещать, что сделаю в скором времени.
Если руки дойдут – оповещу Вас.
34. maxx 913 14.10.19 09:13 Сейчас в теме
Добрый день! По поводу использования такого стандарта 1С. Если вот такой пример. Пусть надуманный, но недалеко от реального использования.

Есть торговая сеть, состоящая из независимых организаций какого-нибудь торгового бренда, сети. Организации независимые (разные юридическое лица) и имеют свои базу 1С пусть "1С:Управление торговлей", но доработки у каждого свои , учитывающие своим местные особенности, свои программисты.

Так как организации представляют один брэнд, они хотят при отсутствии товару у себя, посмотреть у своих коллег в других регионах. Так как единой общей базы нет, то решили сделать следующее: пользователи баз 1С могут зайти в личный веб-кабинет и там увидеть остатки других организаций в других регионах. Для этого используется технология http-запросов или soap-запросов, при этом конечно в самих базах 1С заведены пользователи только "свои", не чужих регионов.

В своей родной "базе" 1С реализован механизм выдаче токена пользователю для веб-кабинета c правами на просмотр разной информации. Между базами 1С произведен обмен SecretKey. В каждой базе 1С реализовали веб-сервис, который получает Token и уже разобрав токен, понимается какие права данного пользователя, время токена и т.п.

Возможно, такое использование?
35. keypax 103 14.10.19 11:06 Сейчас в теме
(34) Да, отличный пример!

Благодаря JWT нет необходимости всем участникам сети делать в своих базах внешних пользователей.

Я вижу процесс так:
Участник сети выдает веб-кабинету свой SecretKey.
Веб-кабинет с помощью SecretKey делает токен.
Другой участник сети с помощью токена может сходить в базу первого участника сети за остатками.
Первый участник сети по токену и SecretKey может определить выполнять запрос или нет.
Токен не дает перманентный доступ - у него есть срок годности.

Чтобы такую систему запустить нужно всем добавить в свои базы функционал:
1. Генерация SecretKey и отправка его в Веб-кабинет
2. HTTP-сервис, который умеет проверять токены и отдавать остатки
Это можно реализовать через расширение.
Ещё нужно сделать веб-кабинет, который фактически может не иметь веб-интерфейса. Достаточно сделать HTTP-сервис, который умеет принимать SecretKey и выдавать токены.
36. maxx 913 14.10.19 11:28 Сейчас в теме
(35) Один момент, который хотелось бы уточнить, нужно ли передавать веб-кабинету SecretKey, почему SecretKey нельзя передавать между базами 1С просто и там хранить?.

А если веб-кабинет, сделан на чистом js (есть фрейворки сейчас даже таки) с запросами ajax, т.е. весь веб-часть это клиентская часть (т.е. там хранить SecretKey не надо)?

Т.е. выдача токена в базе 1С с помощью SecretKey "базы 1", а в другой базе 1С "базы 2" проверка этого токена с помощью SecretKey, т.е. база1 обменялось с базой2 SecretKey (конечно, если SecretKey по-хорошему для каждой базы 1С надо делать свой, чтобы в случае проблем можно было быстро поменять SecretKey и ранее выданные токены перестали работать).
37. keypax 103 14.10.19 12:51 Сейчас в теме
(36) Можно так сделать как вы описываете, но тогда JWT теряет свой смысл, потому что все смогут бесконтрольно делать токены.
Если токены выдавать централизовано, то можно ограничить количество токенов, чтобы пользователи не злоупотребляли возможностью видеть остатки у других пользователей.
В токене ведь кроме срока его действия можно хоть конкретный код номенклатуры указать.
43. leemuar 20.01.20 12:24 Сейчас в теме
Большое спасибо за код!

Очень жаль что ваша статья не находится первой в результате поисковиков по запросу "hmac для 1с", там костыли для старых версий платформы
44. sisdrou 22 30.01.20 09:38 Сейчас в теме
При формировании JWT, кодирует символ "\" перед каждым параметром в JSON. Как от этого избавиться ?
45. slaviksoft 73 16.04.20 12:22 Сейчас в теме
Есть проблема при декодировании (возможно и кодировании)
Парсинг JSON в структуру не подходит
Такие ключи как "user-agent" невозможно в структуру поместить
Очевидно тут больше подошло бы соответствие.
46. slaviksoft 73 16.04.20 12:23 Сейчас в теме
Недопустимое имя свойства: 'user-agent' для чтения JSON в объект Структура
{CommonModule.JWT.Module(228)}: Return ReadJSON(JSONReader, False);
{CommonModule.JWT.Module(152)}: payloadData = ParseJSON(payloadJson);
{DataProcessor.HMAC_JWT.Form.Form.Form(44)}: Payload = JWT.DecodeHS256(JWT_Value, JWT_Key);
{DataProcessor.HMAC_JWT.Form.Form.Form(63)}: JWT_DecodeAtServer();

по причине:
Недопустимое имя свойства: 'user-agent' для чтения JSON в объект Структура
47. anton.fly7 149 28.04.20 13:32 Сейчас в теме
Случайно не подскажете как зашифровать JWT алгоритмом ES256 ?
в питоне это выглядит так jws.sign(claims, secret2, algorithm=ALGORITHMS.ES256)
48. Xershi 1030 19.10.20 16:00 Сейчас в теме
В типовых модуль "РаботаВМоделиСервисаБТС":

#Область Криптография

Функция HMACSHA256(Знач Ключ, Знач Данные)
	
	Возврат HMAC(Ключ, Данные, ХешФункция.SHA256, 64);
	
КонецФункции

Функция Хеш(ДвоичныеДанные, Тип)
	
	Хеширование = Новый ХешированиеДанных(Тип);
	Хеширование.Добавить(ДвоичныеДанные);
	
	Возврат Хеширование.ХешСумма;
		
КонецФункции

Функция HMAC(Знач Ключ, Знач Данные, Тип, РазмерБлока)
	
	Если Ключ.Размер() > РазмерБлока Тогда
		Ключ = Хеш(Ключ, Тип);
	КонецЕсли;
	
	Если Ключ.Размер() < РазмерБлока Тогда
		Ключ = ПолучитьHexСтрокуИзДвоичныхДанных(Ключ);
		Ключ = Лев(Ключ + ПовторитьСтроку("00", РазмерБлока), РазмерБлока * 2);
	КонецЕсли;
	
	Ключ = ПолучитьБуферДвоичныхДанныхИзДвоичныхДанных(ПолучитьДвоичныеДанныеИзHexСтроки(Ключ));
	
	ipad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("36", РазмерБлока));
	opad = ПолучитьБуферДвоичныхДанныхИзHexСтроки(ПовторитьСтроку("5c", РазмерБлока));
	
	ipad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
	ikeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(ipad);
	
	opad.ЗаписатьПобитовоеИсключительноеИли(0, Ключ);
	okeypad = ПолучитьДвоичныеДанныеИзБуфераДвоичныхДанных(opad);
	
	Возврат Хеш(СклеитьДвоичныеДанные(okeypad, Хеш(СклеитьДвоичныеДанные(ikeypad, Данные), Тип)), Тип);
	
КонецФункции

Функция СклеитьДвоичныеДанные(ДвоичныеДанные1, ДвоичныеДанные2)
	
	МассивДвоичныхДанных = Новый Массив;
	МассивДвоичныхДанных.Добавить(ДвоичныеДанные1);
	МассивДвоичныхДанных.Добавить(ДвоичныеДанные2);
	
	Возврат СоединитьДвоичныеДанные(МассивДвоичныхДанных);
	
КонецФункции

Функция ПовторитьСтроку(Строка, Количество)
	
	Части = Новый Массив(Количество);
	Для к = 1 По Количество Цикл
		Части.Добавить(Строка);
	КонецЦикла;
	
	Возврат СтрСоединить(Части, "");
	
КонецФункции

#КонецОбласти
Показать
Оставьте свое сообщение

См. также

Практический пример настройки обмена с казначейством в БГУ Промо

Внешние источники данных v8 БГУ Россия Госбюджет Абонемент ($m)

Материалов для бюджетников, всегда не хватает, особенно с практическими примерами. Попробую описать процесс настройки с нуля обмена с ОФК/УФК на примере выгрузки документа «Заявки на кассовый расход» из БГУ и импорта в СЭД.

1 стартмани

13.04.2012    66272    Vestr    17    

Вебхук. Путь Телеграма

Внешние источники данных Интеграция v8 Абонемент ($m)

Долгое (на самом деле нет) и нелегкое путешествие телеграма к неведомым (из за РКН) конфигурациям 1С. Памятка себе.

1 стартмани

03.10.2019    17553    platonov.e    26    

Передача данных с сервера на клиент через WebSocket NativeAPI и Centrifugo

Интеграция v8::УФ 1cv8.cf Россия Бесплатно (free)

В статье описываю реализацию обмена для замены передачи сообщений через 1С Сервер взаимодействия.

23.09.2019    7526    malikov_pro    11    

Описание формата внутреннего представления данных 1С в контексте обмена данными

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Фирма 1С не рекомендует использовать внутреннее представление данных для любых целей, которые отличны от обмена с 1С:Предприятием 7.7. Но сама возможность заглянуть на "внутреннюю кухню" платформы с помощью функций ЗначениеВСтрокуВнутр(), ЗначениеВФайл(), ЗначениеИзСтрокиВнутр() и ЗначениеИзФайла(), дала возможность сообществу программистов 1С разработать новые приемы разработки и анализа. Так, именно на использовании внутреннего представления был построен алгоритм "быстрого массива", который позволяет практически мгновенно создать массив в памяти на основании строки с разделителями. С помощью разбора внутреннего представления можно "на лету" программным кодом выполнить анализ обычной формы и даже сделать редактор графической схемы. Во внутреннем формате сохраняют свои данные между сеансами различные популярные внешние обработки. А еще это возможность сделать быстрый обмен с внешними системами.

1 стартмани

06.09.2019    19419    Dementor    30    

Обмен большими данными между клиентом и сервером

Внешние источники данных v8 Абонемент ($m)

В статье рассматривается вопрос передачи больших объемов данных, превышающих теоретический лимит сеансовых данных (4Гб за вызов) (они же временное хранилище) как с клиента на сервер, так и в обратном направлении.

1 стартмани

27.08.2019    13511    logos    24    

АИТП. Простой, событийно-управляемый обмен данными

Внешние источники данных v8 1cv8.cf Абонемент ($m)

В статье, на примере обмена с ЗУП 3.1, демонстрируется механизм событийно-управляемого взаимодействия конфигурации АИТП с прикладными решениями на платформе 1С:Предприятие.

1 стартмани

04.07.2019    4874    blackhole321    0    

Интеграция 1С с Битрикс CRM через REST API

Внешние источники данных v8 1cv8.cf Абонемент ($m)

На фоне неутихающего обострения «бизнеса» по внедрению СРМ-систем остро встают вопросы обмена данными с уже существующими системами. В статье рассматривается выгрузка контактов, товаров и сделок из 1С в Битрикс CRM через REST API, приложена обработка для тестирования.

1 стартмани

28.06.2019    22053    muzipov    9    

1C + Python + Django Rest Framework + Vue.js. Опыт несложной full-stack разработки

Практика программирования Внешние источники данных Обмен через XML WEB Разработка v8 1cv8.cf Абонемент ($m)

В этой статье мы рассмотрим путь и основные моменты создания небольшого вэб-сервиса, который мы называем "Онлайн Прайс-лист". Выгрузка из 1С, бэкенд, фронтенд, получение заказов в 1С.

1 стартмани

22.04.2019    33126    riposte    65    

Аутентификация на внешних сервисах посредством OAuth

Информационная безопасность Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

Пример подключения к сервисам Google из 1С с помощью протокола OAuth и получения данных с внешнего сервиса.

1 стартмани

03.04.2019    20166    binx    126    

Телеграм + 1С + Вебхуки + Апач + Самоподписанный сертификат

Внешние источники данных v8 Абонемент ($m)

Много строк исписано про интеграцию Телеграма и 1С. Но нигде не увидел полной инструкции по установке и настройке вебхуков. Попробую её написать.

1 стартмани

26.02.2019    15941    alexlx    30    

Универсальное расширение 1С для Google Таблиц и Документов

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Эта статья для тех, кто использует G Suite и 1С. Готовое решение для выгрузки отчетов и печатных форм из баз 1С в Google Диск в формате Google Таблиц и Google Документов. Информация по его внедрению. Описание создания и настройки проекта в GCP.

1 стартмани

31.01.2019    16374    Maria18    25    

Применение средств MS SQL R service для 1С

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Некоторое время назад Microsoft добавила в MS SQL сервер службы машинного обучения, позволяющие выполнять программный код на языках программирования R и Python. В статье будет продемонстрирована общая схема и принцип того, как можно использовать данные службы в контексте разработки на 1С. 

1 стартмани

25.11.2018    14314    Robbi    14    

Связка 1С и Telegram. Отправка стикеров

Практика программирования Внешние источники данных v8 v8::УФ 1cv8.cf Абонемент ($m)

В качестве факультатива сейчас изучаю возможности связки 1С и мессенджера Telegram. И возник вопрос, как помимо сообщений, посылать в ответ на действия пользователя произвольный стикер? Решению этой мини задачи и посвящена данная статья.

1 стартмани

31.07.2018    12461    Skin123    4    

Опыт интеграции мессенджера Telegram c 1C

Внешние источники данных Интеграция v8 Абонемент ($m)

Статья будет полезна всем, кто интересуется возможностями интеграции 1С с мессенджером Telegram. Пустовой Вячеслав в формате короткого мастер-класса рассказывает о создании и настройке бота, позволяющего, к примеру, упростить процессы согласования платежей внутри компании, отгрузки со склада или получение оперативной информации о состоянии дебиторской задолженности.

19.07.2018    21566    VachKirp    41    

Опять про sFTP и вообще

Внешние источники данных v8 1cv8.cf Абонемент ($m)

Памятка для разработчика по работе с FTP, FTPs и sFTP.

1 стартмани

23.05.2018    18483    leongl    13    

Использование регулярных выражений (RegExp) в Linux

Сервисные утилиты Администрирование данных 1С Внешние источники данных v8 Абонемент ($m)

Описывается способ использования регулярных выражений (RegExp) в Linux с использованием тех же компонентов, что и в Windows (COM-объекты VBScript.RegExp).

1 стартмани

20.04.2018    8543    vsbronnikov    12    

Практикум по созданию обменов данными через протокол oData «за полдня»

Практика программирования Внешние источники данных v8 1cv8.cf Россия Абонемент ($m)

Про oData и 1С было довольно много написано, однако же описания работы и с чтением, и с записью данных через JSON я так и не встретил ни на этом ресурсе ни на других. Попробую раскрыть эту тему.

1 стартмани

20.03.2018    26288    timm00    64    

Практика доступа в базу 1С через протокол oData. Изменение данных

Практика программирования Внешние источники данных v8 1cv8.cf Абонемент ($m)

Продолжаем знакомство с протоколом oData и в данной статье мы рассмотрим такие вопросы, как минимально необходимый багаж теоретических знаний, необходимый для работы, способы изменения доступных данных, а также с какими ограничениями можем при этом столкнуться. Осторожно, будет много скриншотов!

1 стартмани

30.12.2017    34690    Dementor    27    

Инструкция по настройке загрузки из ФСС электронных листков нетрудоспособности ЭЛН в документ 1С Начисление по больничному листу

Внешние источники данных Зарплата Зарплата v8 КА1 ЗУП2.5 УПП1 Россия БУ ФОМС, ПФ, ФСС Абонемент ($m)

Клиент (страхователь) работает в программе "1С Зарплата и управление персоналом ред.2.5" сдает отчетность через Контур или СБИС и не собирается подключать 1С-Отчетность, при этом хочет загружать электронные больничные в программу 1С Зарплата. Подобная ситуация может быть и для других конфигураций в которых есть документ "Начисление по больничному листу", например Комплексная автоматизация 1.1, Управление производственным предприятием 1.3.

1 стартмани

28.11.2017    150044    rusmil    126    

Google OAuth и мобильное приложение

Мобильная разработка Обмен данными 1С Внешние источники данных WEB v8 v8::Mobile 1cv8.cf Абонемент ($m)

Об аутентификации для работы с сервисами google из мобильного или настольного приложения

1 стартмани

29.08.2017    11531    stveans@gmail.com    3    

Опыт интеграции 1С с системой Меркурий (Часть 5)

Внешние источники данных Интеграция Оптовая торговля Оптовая торговля v8::ОУ 1cv8.cf Сельское хозяйство и рыболовство Транспорт, автопарки, такси Оптовая торговля, дистрибуция, логистика Пищевая промышленность Россия БУ УУ Абонемент ($m)

Описывается опыт внедрения в 1С системы работы с ветеринарно-сопроводительными документами Меркурий. Интеграция еще в процессе и приветствуется обмен опытом.

1 стартмани

10.07.2017    59434    axxell    33    

1С и MongoDB: дружба начинается с RESTHeart'а

Внешние источники данных v8 Абонемент ($m)

Краткое описание того, как подружить MongoDB и 1С: Предприятие используя один из предлагаемых на официальном сайте RESTFul сервисов - RESTHeart.

1 стартмани

03.07.2017    43230    Silenser    8    

Получение информации об экспортных свойствах и методах объектов 1С через COM.

Разработка внешних компонент Внешние источники данных v8 1cv8.cf Абонемент ($m)

Как из тела COM-объекта или внешней компоненты определить состав свойств и методов объектов 1С агрегатных типов? Все ответы здесь.

1 стартмани

03.09.2013    14233    gislink    5    

Синхронизация с сервером 1С во внешнем соединении

Внешние источники данных Универсальные функции v8 1cv8.cf Абонемент ($m)

Позволяет установить время удаленного SQL-сервера на компьютере при выполнении обмена через Внешнее соединение

1 стартмани

27.09.2011    13398    sml    6