В 8.3.21 появилась нативная авторизация в http-сервисе с помощью JWT-токена. Кто знает как настроить это в файле default.vrd? На ИТС нет примера, у самого не получилось, 2 дня мучаюсь - при обращении к сервису с токеном пишет ошибку 402. "Токен доступа недействителен.Некорректное значение параметра 'iss'"
(4) я умею пользоваться поиском перед тем, как писать на формы, знаю все про JWT-токены в не1С-системах, но ни в одной из приведенных ссылок нет примера что именно писать в файле default.vrd
Раскодируйте из base64 первые две части Вашего токена, убедитесь, что они представляют из себя синтаксически правильные json - сообщения.
Проверьте совпадение имени эмитента в токене (заявка/JWT claim "iss") и в файле default.vrd
Попробуйте делать токены, не используя символов кириллицы (только из английских букв).
(5) конечно, я проверял содержимое токена на jwt.io
Токены верные и их "едят" другие, не1С-системы
Внутри нет кириллицы, а так же на всякий случай нет цифр, пробелов и символов, отличных от английских букв в клайме iss.
Я не знаю как правильно оформлять файл default.vrd в плане настройки на JWT-токены. Даже на ИТС нет образца.
Если про ключ в формате base64 я догадался, то о том, что значение iss всегда должно быть равно "ssl" (то есть прибито гвоздями в платформе) - догадаться не смог. Это значит, что сторонние готовые токены использовать не удастся, только свои, самодельные.
Чтобы сгенерировать токен под ЭТУ настройку, используется вот такой код 1С
А
АлгоритмПодписи = АлгоритмПодписиТокенаДоступа.HS256;
ТокенДоступа = Новый ТокенДоступа;
ТокенДоступа.Заголовки.Вставить("alg", Строка(АлгоритмПодписи));
ТокенДоступа.Эмитент = "ssl"; // прибито гвоздями как минимум в 8.3.21.1302
//ТокенДоступа.Получатели.Добавить("testservis"); // вот так указано в примерах в документации - работать не будет.
// нужно вот так
МассивПолучателей = Новый Массив;
МассивПолучателей.Добавить("testservis"); // имя http-сервиса из default.vrd
ТокенДоступа.Получатели = МассивПолучателей;
ТокенДоступа.КлючСопоставленияПользователя = "user1C"; // имя пользователя 1С, у которого должна стоять галочка "Аутентификация токеном доступа"
ТокенДоступа.ВремяСоздания = 1651838400; // в примерах от 1С ляп, токен создается в Москве на 3 часа в будущем и сразу не работает из-за использованнного способа получения timestamp
ТокенДоступа.ВремяЖизни = 2592000;
ТокенДоступа.Идентификатор = Новый УникальныйИдентификатор;
ТокенДоступа.Подписать(АлгоритмПодписи, "0KHQuNC60YDQtdGC0L3Ri9C5INC60LvRjtGH0Yw="); // ключик из default.vrd
ТекстТокена = Строка(ТокенДоступа); // получим токен строкой
Сообщить(ТекстТокена);
(11)
А как вы решили дату создания?
Допустим я создаю по GMT + 6 в 12:00 и время жизни ставлю 3600 (1 час). Все хорошо, у местных будет час времени на истечение токена.
Теперь у меня есть пользователи которые находятся в GMT + 5, получается для них токен действует 2 часа?
В инете писали чтобы формировал время создания по UTC что не совсем мне понятно, в любом случае если UTC это всемирное координированное время а GMT это среднее время по Гринвичу то в любом случае будет разница во времени жизни токена?
Вроде в токене просто секунды, нет информации что там токен создали по GMT + 6...
Как вы это решили подскажите пожалуйста? ТекущаяУниверсальнаяДата?
(11)
Такая конструкция в jwt.io показывает ошибку даты: "Invalid date"
Значение "iat" должно быть без кавычек, т.е. числового типа.
Самое интересное, что 1С в любом случае создает эти поля строкового типа, но затем при обращении сам же выдает ошибку, что "iat" некорректный. Т.е. при создании токена не следует формату полей дат, а при проверке следует. Таким образом, токены, созданные в 1С, не проходят проверку корректности в jwt.io и следовательно не подходят для работы.
Кто-то смог победить такое?
Частично веб-сервисы победил (под апач), а вот с IIS не могу справиться? У кого-нибудь есть идеи?
А в чем принципиальная разница? Появилась необходимость сделать авторизацию на WS с помощью JWT. С какой стороны копать, что делали для apache? может коллективно и IIS победим.
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 сообщения: неверная версия сообщения.
(23) Добавляя массив в ТокенДоступа.Получатели вы на уровне платформы заполняете значение для ключа "aud" в ПолезнаяНагрузка. Главное учесть, что имя http-сервиса (значение атрибута "name" элемента "service") может отличаться от значения вложенного элемента "accessTokenRecepientName".
В раздел payload токена можно записать и другие произвольные значения. Платформа это позволяет.
Но я не нашел в платформе возможности прочитать данные из токена, по которому была выполнена авторизация.
Плохо искал или действительно их нет и нужно использовать 1c-jwt?