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
	ТекстТокена = Строка(ТокенДоступа); // получим токен строкой
	
	Сообщить(ТекстТокена);
Показать
gygabites12; user1225808; dim9; Вульфстен; +4 Ответить
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
Оставьте свое сообщение
Вакансии
1С аналитик
Москва
зарплата от 210 000 руб.
Полный день

Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)