JWT авторизация в http-сервисе 8.3.21

1. efin 06.05.22 19:12 Сейчас в теме
В 8.3.21 появилась нативная авторизация в http-сервисе с помощью JWT-токена. Кто знает как настроить это в файле default.vrd? На ИТС нет примера, у самого не получилось, 2 дня мучаюсь - при обращении к сервису с токеном пишет ошибку 402. "Токен доступа недействителен.Некорректное значение параметра 'iss'"

Конструкция в default.vrd вот такая

<accessTokenAuthentication>
<issuers>
<issuer name="TEST" keyInformation="testwsfjwpfwjfpweojfpjpeo2323operj2p3r"/>
</issuers>

</accessTokenAuthentication>



Собственно, без этой конструкции такое же сообщение )
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
8. laperuz 46 08.05.22 05:06 Сейчас в теме +5 $m
С партнёрского от 1С:

Добрый день.

"iss": "issuer"

В токене поле "iss" должно быть равно "ssl".



Используемая для работы с JWT библиотека принимает ключи только в формате BASE64. Попробуйте заменить формат ключа в коде и в vrd-файле. Например:

ТокенДоступа.Подписать(АлгоритмПодписиТокенаДоступа.HS256, "EgH23sF8nL3xEGT2kEmAgxWyaKWvcf3p");




<accessTokenAuthentication>
<issuers>
<issuer
name="ssl"
authenticationClaimName="sub"
authenticationUserPropertyName="name"
keyInformation="EgH23sF8nL3xEGT2kEmAgxWyaKWvcf3p"
/>
</issuers>
<accessTokenRecepientName>"token"</accessTokenRecepientName>­
</accessTokenAuthentication>
Показать


Ну и на скриншоте пример рабочего vrd
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. ishelper 06.05.22 20:00 Сейчас в теме
Может быть, вот эта публикация будет чем-то полезна, включая комментарии.
3. efin 06.05.22 20:56 Сейчас в теме
(2) нет, она о другой технологии доступа
6. efin 08.05.22 03:01 Сейчас в теме
(4) я умею пользоваться поиском перед тем, как писать на формы, знаю все про JWT-токены в не1С-системах, но ни в одной из приведенных ссылок нет примера что именно писать в файле default.vrd
5. gml 07.05.22 17:10 Сейчас в теме
Раскодируйте из base64 первые две части Вашего токена, убедитесь, что они представляют из себя синтаксически правильные json - сообщения.
Проверьте совпадение имени эмитента в токене (заявка/JWT claim "iss") и в файле default.vrd
Попробуйте делать токены, не используя символов кириллицы (только из английских букв).
7. efin 08.05.22 03:04 Сейчас в теме
(5) конечно, я проверял содержимое токена на jwt.io
Токены верные и их "едят" другие, не1С-системы
Внутри нет кириллицы, а так же на всякий случай нет цифр, пробелов и символов, отличных от английских букв в клайме iss.

Я не знаю как правильно оформлять файл default.vrd в плане настройки на JWT-токены. Даже на ИТС нет образца.
8. laperuz 46 08.05.22 05:06 Сейчас в теме +5 $m
С партнёрского от 1С:

Добрый день.

"iss": "issuer"

В токене поле "iss" должно быть равно "ssl".



Используемая для работы с JWT библиотека принимает ключи только в формате BASE64. Попробуйте заменить формат ключа в коде и в vrd-файле. Например:

ТокенДоступа.Подписать(АлгоритмПодписиТокенаДоступа.HS256, "EgH23sF8nL3xEGT2kEmAgxWyaKWvcf3p");




<accessTokenAuthentication>
<issuers>
<issuer
name="ssl"
authenticationClaimName="sub"
authenticationUserPropertyName="name"
keyInformation="EgH23sF8nL3xEGT2kEmAgxWyaKWvcf3p"
/>
</issuers>
<accessTokenRecepientName>"token"</accessTokenRecepientName>­
</accessTokenAuthentication>
Показать


Ну и на скриншоте пример рабочего vrd
Прикрепленные файлы:
9. efin 09.05.22 12:39 Сейчас в теме
(8) Спасибо!

Если про ключ в формате base64 я догадался, то о том, что значение iss всегда должно быть равно "ssl" (то есть прибито гвоздями в платформе) - догадаться не смог. Это значит, что сторонние готовые токены использовать не удастся, только свои, самодельные.

Итак, работающий кусок default.vrd

<service name="testservis"
				rootUrl="testservis"
				enable="true"
				reuseSessions="autouse"
				sessionMaxAge="30"
				poolSize="10"
				poolTimeout="5">
		
				<accessTokenAuthentication>
					<accessTokenRecepientName>testservis</accessTokenRecepientNa­me>
					<issuers>
						<issuer name="ssl" authenticationClaimName="sub" authenticationUserPropertyName="name" keyInformation="0KHQuNC60YDQtdGC0L3Ri9C5INC60LvRjtGH0Yw="/>
					</issuers>
				</accessTokenAuthentication>
		
		</service>
Показать



Чтобы сгенерировать токен под ЭТУ настройку, используется вот такой код 1С


А
АлгоритмПодписи = АлгоритмПодписиТокенаДоступа.HS256;
	ТокенДоступа = Новый ТокенДоступа;
	ТокенДоступа.Заголовки.Вставить("alg", Строка(АлгоритмПодписи));
	ТокенДоступа.Эмитент = "ssl";  // прибито гвоздями как минимум в 8.3.21.1302        
	
	//ТокенДоступа.Получатели.Добавить("testservis"); // вот так указано в примерах в документации - работать не будет. 
// нужно вот так
	МассивПолучателей = Новый Массив;
	МассивПолучателей.Добавить("testservis"); // имя http-сервиса из default.vrd
	ТокенДоступа.Получатели = МассивПолучателей;


	ТокенДоступа.КлючСопоставленияПользователя = "user1C"; // имя пользователя 1С, у которого должна стоять галочка "Аутентификация токеном доступа"
	ТокенДоступа.ВремяСоздания = 1651838400; // в примерах от 1С ляп, токен создается в Москве на 3 часа в будущем и сразу не работает из-за использованнного способа получения timestamp
	ТокенДоступа.ВремяЖизни = 2592000; 
	ТокенДоступа.Идентификатор = Новый УникальныйИдентификатор;
	ТокенДоступа.Подписать(АлгоритмПодписи, "0KHQuNC60YDQtdGC0L3Ri9C5INC60LvRjtGH0Yw="); // ключик из default.vrd
	ТекстТокена = Строка(ТокенДоступа); // получим токен строкой
	
	Сообщить(ТекстТокена);
Показать
kaaasteeen; gygabites12; user1225808; dim9; Вульфстен; +5 Ответить
10. gml 09.05.22 13:31 Сейчас в теме
Для окончательной ясности приложите, пожалуйста, раскодированный из Base64 токен, сгенерированный в Вашем примере.
11. efin 09.05.22 15:12 Сейчас в теме
(10)

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

{
"jti": "861aba11-6104-485b-8813-f8c46bb2274a",
"exp": "1654430400",
"aud": "testservis",
"sub": "user1C",
"nbf": "1651838400",
"iat": "1651838400",
"iss": "ssl"
}
12. aibasoft 10 01.08.22 11:34 Сейчас в теме
(11)
А как вы решили дату создания?
Допустим я создаю по GMT + 6 в 12:00 и время жизни ставлю 3600 (1 час). Все хорошо, у местных будет час времени на истечение токена.
Теперь у меня есть пользователи которые находятся в GMT + 5, получается для них токен действует 2 часа?
В инете писали чтобы формировал время создания по UTC что не совсем мне понятно, в любом случае если UTC это всемирное координированное время а GMT это среднее время по Гринвичу то в любом случае будет разница во времени жизни токена?
Вроде в токене просто секунды, нет информации что там токен создали по GMT + 6...
Как вы это решили подскажите пожалуйста? ТекущаяУниверсальнаяДата?
27. CrazyHands 37 07.12.22 08:41 Сейчас в теме
(12)
Я решил вопрос вот так:
ВремяСоздания = Дата(1,1,1) + ТекущаяУниверсальнаяДатаВМиллисекундах()/1000 - Дата(1970,1,1,1,0,0);
17. w1000 18.10.22 05:09 Сейчас в теме
(11)
Такая конструкция в jwt.io показывает ошибку даты: "Invalid date"
Значение "iat" должно быть без кавычек, т.е. числового типа.
Самое интересное, что 1С в любом случае создает эти поля строкового типа, но затем при обращении сам же выдает ошибку, что "iat" некорректный. Т.е. при создании токена не следует формату полей дат, а при проверке следует. Таким образом, токены, созданные в 1С, не проходят проверку корректности в jwt.io и следовательно не подходят для работы.
Кто-то смог победить такое?
18. w1000 18.10.22 07:32 Сейчас в теме
(17)
Моя ошибка.
Нужно создавать даты на время UTC, как и указывал автор.
13. user1703083 22.08.22 15:46 Сейчас в теме
Добрый день. А по web-сервисам есть примеры использования JWT? Не могу понять куда его (токен) передать чтобы произошла авторизация.
14. user1703083 23.08.22 13:11 Сейчас в теме
Частично веб-сервисы победил (под апач), а вот с IIS не могу справиться? У кого-нибудь есть идеи?
15. shapa_pro 26.08.22 11:40 Сейчас в теме
(14)
Частично веб-сервисы победил (под апач), а вот с IIS не могу справиться? У кого-нибудь есть идеи?


А в чем принципиальная разница? Появилась необходимость сделать авторизацию на WS с помощью JWT. С какой стороны копать, что делали для apache? может коллективно и IIS победим.
16. shapa_pro 12.09.22 17:26 Сейчас в теме
(14) Победил.
Сложности с которыми столкнулся. в WS прокси надо прописывать местоположение с токеном примерно так

Прокси = Новый WSПрокси(Определения,
			"http://www.1c.ru/dm",
			"DMService",
			"DMServiceSoap",
			ИнтернетПрокси,
			Таймаут,
			ЗащищенноеСоединение, 
			//JWT
			МестоположениеWSDL + "ws/dm.1cws?AccessToken="+ТекстТокена,  
			//JWT
			ПоддерживаетсяАутентификацияОС И ИспользуетсяАутентификацияОС);
Показать


ну и проверка доменки пользователя идет на IIS без слэшей, а хранится в базе с ними, поэтому передал вот так

    ТокенДоступа.КлючСопоставленияПользователя =  СтрЗаменить(ПользователиИнформационнойБазы.ТекущийПользователь().ПользовательОС,"\\","");
21. user656502_roolee10 31.10.22 13:32 Сейчас в теме
(16) Покажите, пожалуйста, vrd файл для web-сервисов. Не могу понять как корректно поправить его.
24. user1854849 01.11.22 16:31 Сейчас в теме
(21)
Прикрепленные файлы:
user656502_roolee10; +1 Ответить
25. user656502_roolee10 02.11.22 11:05 Сейчас в теме
(24)
(16) Пробую сделать авторизацию токеном для бесшовки в Документообороте 2.1. Столкнулся с тем, что для WSПрокси создаваемого на основании WSОпределения, уже на этапе создания WSОпределения не проходит авторизация. Пришлось там тоже прописывать токен

НовоеМестоположениеWSDL = МестоположениеWSDL + "ws/dm.1cws?wsdl&AccessToken=" + ТокенДоступа;
Определения = Новый WSОпределения(НовоеМестоположениеWSDL,
ИмяПользователя,
Пароль,
ИнтернетПрокси,
Таймаут,
ЗащищенноеСоединение,
ПоддерживаетсяАутентификацияОС И ИспользуетсяАутентификацияОС);

И для WSПрокси тоже дублировать авторизацию токеном

Прокси = Новый WSПрокси(Определения,
"http://www.1c.ru/dm",
"DMService",
"DMServiceSoap",
ИнтернетПрокси,
Таймаут,
ЗащищенноеСоединение,
НовоеМестоположениеWSDL,
ПоддерживаетсяАутентификацияОС И ИспользуетсяАутентификацияОС);

Но при вызове выходит ошибка

Запрос = СоздатьОбъект(Прокси, "DMGetVersionRequest");
Ответ = Прокси.execute(Запрос);


Ошибка при вызове метода контекста (execute)
{ОбщийМодуль.ИнтеграцияС1СДокументооборот.Модуль(5008)}:Ответ = Прокси.execute(Запрос);
{ОбщийМодуль.ИнтеграцияС1СДокументооборот.Модуль(244)}:ВерсияСервиса = ПолучитьВерсиюВызовомСервиса(ИмяПользователя, Пароль, ИспользуетсяАутентификацияОС);
{ОбщийМодуль.ИнтеграцияС1СДокументооборотВызовСервера.Модуль(551)}:ИнтеграцияС1СДокументооборот.УстановитьВерсиюСервиса(Неопределено,
{Обработка.ИнтеграцияС1СДокументооборот.Форма.АвторизацияВ1СДокументооборот.Форма(91)}:ИнтеграцияС1СДокументооборотВызовСервера.УстановитьВерсиюСервисаВПараметрыСеанса();

по причине:
При вызове веб-сервиса произошла ошибка. Ошибка вызова операции сервиса: {http://www.1c.ru/dm}:DMService:execute()
по причине:
Ошибка разбора SOAP сообщения: неверная версия сообщения.
26. user656502_roolee10 02.11.22 20:23 Сейчас в теме
(24)
(25)
НовоеМестоположениеWSDL = МестоположениеWSDL + "ws/dm.1cws?wsdl&AccessToken=" + ТокенДоступа;


Разобрался.
Вместо этого для WSПрокси нужно было указывать местоположение без wsdl

НовоеМестоположениеWSDL = МестоположениеWSDL + "ws/dm.1cws?AccessToken=" + ТокенДоступа;
Прокси = Новый WSПрокси(Определения,
"http://www.1c.ru/dm",
"DMService",
"DMServiceSoap",
ИнтернетПрокси,
ТаймаутСервиса(),
ЗащищенноеСоединение,
НовоеМестоположениеWSDL,
ИспользуетсяАутентификацияОС);

(16) Всё верно указал. Это моя невнимательность.
19. davlen 62 18.10.22 14:09 Сейчас в теме
Доброго дня подскажите пожалуйста, все делаю как у вас, но у меня сервис выдает вот такое, уже голову сломал, что может быть не так:

<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet type="text/xsl" href="/redirect.php?url=aHR0cDovL2xvY2FsaG9zdC9EZW1vVHJkU2VydmljZS9lMWNzeXMvdnJzY29yZS9leGNlcHRpb24ueHNsdD9zeXN2ZXI9OC4zLjIxLjEzMDI="?><exception xmlns="http://v8.1c.ru/8.2/virtual-resource-system" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="Exception" clsid="580392e6-ba49-4280-ac67-fcd6f2180121" reason="-16"><descr xmlns="http://v8.1c.ru/8.1/data/core">Claim not foundaud</descr><category xmlns="http://v8.1c.ru/8.1/data/core">0000000000000000000000</category><creationStack­ xmlns="http://v8.1c.ru/8.1/data/core">core83.dll:0x0000000000085998 vrsbase.dll:0x000000000009B229 vrsbase.dll:0x00000000002B8AC6 VCRUNTIME140.dll:0x0000000000000000 VCRUNTIME140.dll:0x0000000000000000 ntdll.dll:0x0000000000000000 vrsbase.dll:0x00000000000F2851 vrsbase.dll:0x000000000009DA68 vrsbase.dll:0x000000000009CF76 vrsbase.dll:0x000000000009C650 vrsbase.dll:0x00000000000D793C vrsbase.dll:0x00000000000DCC13 vrsbase.dll:0x00000000000995DE vrsbase.dll:0x00000000000E4F83 vrsbase.dll:0x00000000000DA59F vrsbase.dll:0x00000000000E51E5 vrsbase.dll:0x00000000000E589D core83.dll:0x00000000002B166B core83.dll:0x00000000002B169C core83.dll:0x000000000017576E ucrtbase.DLL:0x0000000000000000 kernel32.dll:0x0000000000000000 ntdll.dll:0x0000000000000000 </creationStack></exception>

Токен проверяю на https://jwt.io/ все нормально разбирает.
20. davlen 62 18.10.22 14:25 Сейчас в теме
(19) все не актуально, победил я его))) не хватало в поле полезной нагрузки aud
22. user656502_roolee10 31.10.22 18:01 Сейчас в теме
(20) Тоже столкнулся с такой ошибкой, подскажите как решили?
23. davlen 62 31.10.22 22:08 Сейчас в теме
(22) Просто добавил

    ТокенДоступа.ПолезнаяНагрузка.Вставить("aud", "Test");

Test это имя http сервиса.
user656502_roolee10; +1 Ответить
33. gygabites12 26.01.24 19:53 Сейчас в теме
(23) Добавляя массив в ТокенДоступа.Получатели вы на уровне платформы заполняете значение для ключа "aud" в ПолезнаяНагрузка. Главное учесть, что имя http-сервиса (значение атрибута "name" элемента "service") может отличаться от значения вложенного элемента "accessTokenRecepientName".
28. pavlushov 29 22.01.23 18:33 Сейчас в теме
Люди добрые, подскажите откуда брать keyInformation?
29. efin 22.01.23 21:16 Сейчас в теме
(28) см сообщение (9)
ТокенДоступа.Подписать(АлгоритмПодписи, "0KHQuNC60YDQtdGC0L3Ri9C5INC60LvRjtGH0Yw="); // ключик из default.vrd

вот этот ключик должен быть одинаковый с keyInformation в default.vrd

сгенерировать его нужно самому, любой секретный текст кодируется в base64 - и ключ готов
30. pavlushov 29 22.01.23 22:40 Сейчас в теме
(29) а как его самому сгенерировать? Просто случайный набор символов любой длины?
31. efin 23.01.23 11:36 Сейчас в теме
(30) Да. Главное, чтобы потом в base64 закодировать. Так на партнерском форуме 1С сказали делать.
32. buzzzard 51 13.03.23 02:42 Сейчас в теме
В раздел payload токена можно записать и другие произвольные значения. Платформа это позволяет.
Но я не нашел в платформе возможности прочитать данные из токена, по которому была выполнена авторизация.
Плохо искал или действительно их нет и нужно использовать 1c-jwt?
34. gygabites12 26.01.24 19:56 Сейчас в теме
(32) В режиме конфигуратора в ЖР для соответствующего события видны некоторые данные аутентификации, например, УникальныйИдентификатор токена.
Прикрепленные файлы:
35. _Pups_ 03.02.24 10:07 Сейчас в теме
А у кого-нибудь получилось подписать токен алгоритмом PS256 ?
36. Shaker84 01.03.24 11:39 Сейчас в теме
(35)
В 8.23 есть новый объект ТокенДоступа, он умеет подписывать RS256
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот