Имя: Пароль:
1C
1С v8
Нужна помощь с авторизацией OpenID в Диадок API
0 АЛьФ
 
03.04.26
14:56
Кто-нибудь настраивал работу в Диадок API с авторизацией через OpenID Connect?
Второй день бьюсь с ТП Контура. Они никак не могут ответить есть ли у них возможность авторизоваться без участия пользователя. При этом в документации самого OpenID Connect такая возможность описана. Только не работает, если следовать их инструкции.

Решил уже хоть через пользователя зайти. Опять облом - сервер возвращает ошибку (причем в виде текста странички html, а не как у них в документации описано).

Кто-нибудь может мне простыми словами пояснить как с этим OpenID работать или дать ссылку на вменяемый мануал для нубов?
1 PLUT
 
гуру
03.04.26
15:15
(0) а в подключаемом модуле если подсмотреть?

у меня есть логин/пароль сотрудника организации в диадоке. в системных настройках расширенных есть у них "Учетная запись для обмена с сервером"

вот там логин/пароль и работает фоновое задание для "чтения ленты событий по организации"
2 АЛьФ
 
03.04.26
15:29
2(1) В каком подключаемом модуле?
С методами авторизации самого Диадока (логин-пароль, сертификат) проблем нет, все работает. Только эти методы объявлены ими устаревшими и в любой момент могут перестать работать.
3 PLUT
 
гуру
03.04.26
15:31
(2) это "напильник" для доработки под нужды зокащека

Подключаемый модуль (ПМ) — это вспомогательная внешняя обработка. ПМ содержит функции для обработки событий в зависимости от конфигурации 1С и бизнес-процессов организации.

В случае нехватки функционала стандартного модуля ПМ добавит новый сценарий.

https://developer.kontur.ru/Docs/Diadoc_UM/proc/_Work_PM.html
4 PLUT
 
гуру
03.04.26
15:49
я не ковырял магию в ПМ, каким способом он авторизуется в Диадоке (openID или по-старинке), но фоновые задания работают. Основной модуль самый распоследний у нас 4.64.3 установлен как внешняя обормотка (автоматически обновляется)
5 АЛьФ
 
03.04.26
15:38
2(3) Вот ваще понятней не стало. Это надо у них что-то покупать дополнительно?
У нас полностью собственная реализация работы с Диадоком. А 7.7 используется много лет их компонента.
В 8.3 (т.к. поддержку компоненты они прекратили, а простую авторизацию объявили устаревшей) сейчас пытаемся разобраться с рекомендуемым ими OpenID Connect.
https://developer.kontur.ru/docs/diadoc-api/authentication.html
6 PLUT
 
гуру
03.04.26
15:52
(5) основной модуль покупать у Контура (стандартный под чисто конкретную пофигурацию 1С). ПМ - напильник сбоку бесплатный

или писать своё (как у вас), тогда не нужно покупать

хотя я наверн неправильно сказал. покупать нужно доступ в Контур для использования этого модуля. сам модуль бесплатно (даром)

https://www.diadoc.ru/1C-PRO
7 PLUT
 
гуру
03.04.26
15:58
(5) > А 7.7 используется много лет их компонента

так вот в чём дело. я думал у вас модно/молодежно на острие прогресса
8 АЛьФ
 
03.04.26
16:03
2(6) Спасибо.
2(7) Мы на остриё только пытаемся забраться.
9 rozer76
 
03.04.26
20:52
(4) вы в бущущем? Сейчас 63.2 крайняя.
10 alexxx961503
 
03.04.26
21:00
(10) 4.64.3 - уже несколько дней как на автообновлении обновилась внешняя обработка. Для ПМ не нужна "Учетная запись для обмена с сервером". Как вариант она используется с подключаемыми плагинами Диадок (они отдельно за плату загружаются по организациям)
11 rozer76
 
04.04.26
10:18
(10) ого, удивлен что скачивается 63.2 с сайта, ну у меня допиленная обработка- я такое отключил)
12 АЛьФ
 
06.04.26
09:04
Наконец получил однозначный ответ от Диадока:
Поступил ответ от экспертного отдела. Сообщают, что в API Диадока невозможна аутентификация через OpenID полностью без участия пользователя. В Диадоке обязательно требуется пользовательский контекст, поэтому использование схемы Client Credentials Flow (обезличенной авторизации) не поддерживается.

Т.е. моя задача не решаема через рекомендуемую ими систему авторизации. Придется использовать устаревшие методы, которые в любой момент могут превратиться в тыкву. А после отказываться от использования API (ибо полностью теряется смысл) и тупо сажать человека на механическую работу.
Вот кто такое вообще придумал?
13 d4rkmesa
 
06.04.26
09:12
(12) Как то в 2016 была задача с автоподписью чего-то там Диадоком, коллега тогда сделал все "на клиенте", т.е. в отдельном сеансе запускается сеанс пользователя 1С, обработка, "тыкаются" кнопочки. Даже удивлен, что можно было сделать иначе.
14 Garykom
 
гуру
06.04.26
09:16
(12) Диадок как и любые ЭДО изначально подразумевает участие человека
Но выход есть! Сча же AI есть, посадить его авторизовываться...
15 АЛьФ
 
06.04.26
09:17
2(14) С чего бы вдруг "изначально подразумевает"? Он на то и электронный, чтобы максимально исключить человека.
16 PLUT
 
гуру
06.04.26
09:23
(15)

> Он на то и электронный, чтобы максимально исключить человека

максимально можно исключить, но с УКЭПом не всё так однозначно?

УКЭП для чисто конкретно человека выпускается? по идее этот человек лично должен "подписывать"

"Приравнивается к собственноручной подписи без дополнительных соглашений сторон"

"это цифровой аналог подписи от руки"
17 Stepashkin
 
06.04.26
09:23
(0) Привет. Реализовал конфигурацию на БСП для обмена документами. Авторизация и прием/отправка документов происходит посредством регламентного задания. И там используется логин, пароль и токен авторизации. Логин и пароль предоставлены Контуром.
18 Stepashkin
 
06.04.26
09:24
(16) У меня подписывается все автоматически.
19 PLUT
 
гуру
06.04.26
09:26
(18) я сказал "Нет" твёрдо и чётко, когда меня попросили такое реализовать :) (автоподпись документов)

чтобы потом не говорили - "г@вно эта ваша 1С"
20 Stepashkin
 
06.04.26
09:31
(19) Я делаю то, что мне говорит тимлид, а пользователи верят в магию.
21 Stepashkin
 
06.04.26
09:33
(19) И мозги ему парят, а не мне.
22 PLUT
 
гуру
06.04.26
09:37
(21) у меня даже ни одного автоплатежа не настроено

казалось бы, очень удобно

пусть ручками свои документы подписывают. заодно и вопросов не будет, если что-то не то подписали и отправили

недавно в ДО очень весело было - пять подписантов х.з. что подписали (визы поставили), но не читали что подписуют

скандалы интриги расследования
23 PLUT
 
гуру
06.04.26
09:37
(21) тимлид парит мозги тебе

в иерархии по пищевой цепочке
24 Stepashkin
 
06.04.26
09:39
(23) У меня хороший тимлид, мозги не парит совсем.
25 PLUT
 
гуру
06.04.26
09:40
(24) потыкай в него палочкой. может он сдох?

#391289
09.08.2007 в 11:17
<Аленка> Вот мой муж некогда на меня не кричит
<Аленка> А еще он некогда не матерится и не грубит некому
<Аленка> И за компом не сидит вообще
<Аленка> А еще он мне не изменяет и не ходит по пивнушкам фсяким!
<Аленка> Правда он лапочка? ^_^
<DialSoft> Эмммм...
<DialSoft> Потыкай в него палочкой
<DialSoft> Он походу мертвый (
26 Stepashkin
 
06.04.26
09:40
(22) В моей конфигурации нет посторонних, только автоматы. Пользователи - зло.
27 Stepashkin
 
06.04.26
09:40
(25) Что-то вас не в ту степь повело. Успокойтесь.
28 PLUT
 
гуру
06.04.26
09:42
(26) у нас тоже нет посторонних. только бабароботы в качестве пользователей
29 АЛьФ
 
06.04.26
09:42
2(16) ЭДО - это не только и не столько подписывание документов. Основная масса работы в ЭДО - это отслеживание состояния документов, получение комментариев, проверка приглашений и т.п.
2(17) С логином-паролем и с сертификатом нет никаких проблем. Только они в любой момент могут эти способы авторизации отключить, т.к. они объявлены устаревшими. Смотри в политике устаревания: https://developer.kontur.ru/Docs/diadoc-api/howtostart/deprecationPolicy.html
30 АЛьФ
 
06.04.26
09:44
2(19) А в чем проблема с автоподписью? Ответственный человек согласует, система автоматически подписывает согласованные документы нужной подписью. Если что-то не работает, что 1С - однозначно гавно, т.к. нужно нормально делать.
31 PLUT
 
гуру
06.04.26
09:45
(29) у нас по логину-паролю статусы документов обновляются регл. заданием в 1С

но подписание и отправку - только бабароботы вручную

если что-то сломается, будем на новые прогресивные способы авторизации переходить, тем более у Контура их модуль постоянно допиливается
32 АЛьФ
 
06.04.26
09:45
2(31) Зачем на рутинных работах оставлять людей?
33 PLUT
 
гуру
06.04.26
09:47
(30) у нас нет проблем с автоподписью. ответственный человек сам авторизуется, сам фрешку в USB вставляет и сисьтема автоматически подписывает пакет документов нужной подписью и отправляет
34 PLUT
 
гуру
06.04.26
09:48
(32) как говорил т-щ Сталин - "у каждой ашипки есть имя и фамилия"

поэтому у нас так
35 Stepashkin
 
06.04.26
09:49
(29) Это я читал. Так может сразу смотреть историю изменений?  https://developer.kontur.ru/Docs/diadoc-api/ReleaseNotes.html
36 Stepashkin
 
07.04.26
07:07
(0) Так что в итоге? У вас получилось настроить?
37 Stepashkin
 
07.04.26
07:15
(0) Мы тоже пробовали через OpenID Connect подключаться поначалу, но потом написали в Контур, и они нам сказали использовать устаревший метод. Пока работает.
38 АЛьФ
 
07.04.26
11:22
2(36) В итоге сейчас вот получилось все же разобраться с OIDC. У них в документации ошибка. При авторизации параметры надо передавать не в адресной строке в Query Parameters, как для всех методов Диадок API, а в теле запроса. Но не в JSON, а в виде строки, как Query Parameters.
Механизм получается такой: нужный человек авторизуется, получает все токены, а потом в автоматическом режиме запрашивается обновление токенов уже без участия человека.
Первая часть уже сделана, вторая часть пока непонятно как будет работать, т.к. токен действует сутки и как оно там в итоге получится с запросом обновления токена х.з.
39 Stepashkin
 
07.04.26
13:41
(38) Строку сможете как пример показать?
40 Stepashkin
 
07.04.26
13:41
(38) А заголовки?
41 Stepashkin
 
07.04.26
13:46
(38) Т.е. параметры убираем, в теле прописываем строку. В строке: response_type=code,client_id=айди клиента,scope=openid profile email offline_access Diadoc.PublicAP. Заголовок Content-Type application/x-www-form-urlencoded. Так?
42 Stepashkin
 
07.04.26
13:55
(38) А GET /connect/authorize по этому хосту identity.kontur.ru?
43 Stepashkin
 
07.04.26
14:07
Зачем они все так усложнили, не понятно.
44 Stepashkin
 
07.04.26
14:11
(38)
Первая часть уже сделана, вторая часть пока непонятно как будет работать, т.к. токен действует сутки и как оно там в итоге получится с запросом обновления токена х.з.

Ну отправить код обновления токена и получить токен.
45 АЛьФ
 
07.04.26
15:09
2(39) Вот готовая функция для запроса строки авторизации, получения и обновления токена.

Функция ДиадокАПИ_ВыполнитьЗапросАвторизацииOIDC(АвторизацияЭДО, ИмяМетода, ДополнительныйПараметр = Неопределено, ОбновитьТокены = Ложь) Экспорт
	Результат	= Новый Структура("Ошибка,ТекстОшибки,СтруктураОтвета", Ложь, "", Неопределено);
	
	ЗащищенноеСоединениеOpenSSL = Новый ЗащищенноеСоединениеOpenSSL(
		Новый СертификатКлиентаWindows(),
		Новый СертификатыУдостоверяющихЦентровWindows());
	Соединение = Новый HTTPСоединение("identity.kontur.ru",,,,,,ЗащищенноеСоединениеOpenSSL);
	
	ЗаголовкиЗапроса = Новый Соответствие;
	ЗаголовкиЗапроса.Вставить("Content-Type", "application/x-www-form-urlencoded");

	client_id			= КодироватьСтроку(АвторизацияЭДО.ИдентификаторКлиентаOpenID, СпособКодированияСтроки.КодировкаURL);
	client_secret		= КодироватьСтроку(АвторизацияЭДО.СекретныйКлючOpenID, СпособКодированияСтроки.КодировкаURL);
	
	АдресРесурса		= "/connect/" + ИмяМетода;
	Если ИмяМетода = "deviceauthorization" Тогда
		scope				= КодироватьСтроку("openid offline_access profile email Diadoc.PublicAPI", СпособКодированияСтроки.КодировкаURL);
		ПараметрыЗапроса	= СтрШаблон("client_id=%1&client_secret=%2&scope=%3", client_id, client_secret, scope);
	ИначеЕсли ИмяМетода = "token" Тогда
		Если ОбновитьТокены Тогда
			grant_type			= КодироватьСтроку("refresh_token", СпособКодированияСтроки.КодировкаURL);
			refresh_token		= КодироватьСтроку(ДополнительныйПараметр, СпособКодированияСтроки.КодировкаURL);
			ПараметрыЗапроса	= СтрШаблон("client_id=%1&client_secret=%2&grant_type=%3&refresh_token=%4", client_id, client_secret, grant_type, refresh_token);
		Иначе
			scope				= КодироватьСтроку("openid profile email Diadoc.PublicAPI", СпособКодированияСтроки.КодировкаURL);
			grant_type			= КодироватьСтроку("urn:ietf:params:oauth:grant-type:device_code", СпособКодированияСтроки.КодировкаURL);
			device_code			= КодироватьСтроку(ДополнительныйПараметр, СпособКодированияСтроки.КодировкаURL);
			ПараметрыЗапроса	= СтрШаблон("client_id=%1&client_secret=%2&scope=%3&grant_type=%4&device_code=%5", client_id, client_secret, scope, grant_type, device_code);
		КонецЕсли;
	Иначе
		Результат.Ошибка = Истина;
		Результат.ТекстОшибки = "[Диадок] Неизвестный метод OpenID Connect: " + ИмяМетода;
		Возврат Результат;
	КонецЕсли;
		
	HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса, ЗаголовкиЗапроса);
	HTTPЗапрос.УстановитьТелоИзСтроки(ПараметрыЗапроса);
	
	Ответ		= Соединение.ОтправитьДляОбработки(HTTPЗапрос);
	
	ТекстОтвета = Ответ.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
	Если СтрНайти(Ответ.Заголовки.Получить("Content-Type"),"application/json") = 0 Тогда
		Результат.Ошибка = Истина;
		Результат.ТекстОшибки = "[Диадок] Ошибка аутентификации OpenID: [" + Ответ.КодСостояния + "]
		|" + ТекстОтвета;
		Возврат Результат;
	КонецЕсли;
	
	СтруктураОтвета = Диадок.ПолучитьСтруктуруИзJSON(ТекстОтвета);
	Если Ответ.КодСостояния <> 200 Тогда
		Результат.Ошибка = Истина;
		Результат.ТекстОшибки = "[Диадок] Ошибка аутентификации OpenID: [" + Ответ.КодСостояния + "] " + СтруктураОтвета.error;
		Возврат Результат;
	КонецЕсли;
	
	Результат.СтруктураОтвета	= СтруктураОтвета;
	
	Возврат Результат;
КонецФункции
46 АЛьФ
 
07.04.26
15:12
+(45) Для полноты картины (и обучения забредающих ИИ) код команд в справочнике, в котором сохраняют токены:

&НаСервере
Функция ПолучитьАдресАвторизации()
	РезультатОбновленияТокенов = Диадок.ДиадокАПИ_ВыполнитьЗапросАвторизацииOIDC(Объект, "deviceauthorization");
	Если РезультатОбновленияТокенов.Ошибка Тогда
		Сообщить(РезультатОбновленияТокенов.ТекстОшибки);
		Возврат Неопределено;
	КонецЕсли;
	
	device_code = РезультатОбновленияТокенов.СтруктураОтвета.device_code; // реквизит формы
	Возврат РезультатОбновленияТокенов.СтруктураОтвета.verification_uri_complete;
КонецФункции

&НаКлиенте
Процедура КомандаАвторизация(Команда)
	АдресАвторизации = ПолучитьАдресАвторизации();
	Если АдресАвторизации = Неопределено Тогда
		Возврат;
	КонецЕсли;
	ЗапуститьПриложение(АдресАвторизации + "&prompt=login");
КонецПроцедуры

&НаСервере
Процедура КомандаЗаполнитьТокеныНаСервере(ОбновитьТокены = Ложь)
	Если ОбновитьТокены Тогда
		ДопПараметр	= Объект.ТокенОбновленияOIDC;
	Иначе
		ДопПараметр	= device_code;
	КонецЕсли;
	РезультатОбновленияТокенов = Диадок.ДиадокАПИ_ВыполнитьЗапросАвторизацииOIDC(Объект, "token", ДопПараметр, ОбновитьТокены);
	Если РезультатОбновленияТокенов.Ошибка Тогда
		Сообщить(РезультатОбновленияТокенов.ТекстОшибки);
		Возврат;
	КонецЕсли;
	
	Объект.ТокенАвторизацииOIDC	= РезультатОбновленияТокенов.СтруктураОтвета.access_token;
	Объект.ТокенОбновленияOIDC	= РезультатОбновленияТокенов.СтруктураОтвета.refresh_token;
	Сообщить("Токен действителен до " + (ТекущаяДата() + РезультатОбновленияТокенов.СтруктураОтвета.expires_in));
КонецПроцедуры

&НаКлиенте
Процедура КомандаЗаполнитьТокены(Команда)
	КомандаЗаполнитьТокеныНаСервере();
КонецПроцедуры

&НаСервере
Процедура КомандаОбновитьТокеныНаСервере()
	КомандаЗаполнитьТокеныНаСервере(Истина);
КонецПроцедуры

&НаКлиенте
Процедура КомандаОбновитьТокены(Команда)
	КомандаОбновитьТокеныНаСервере();
КонецПроцедуры
47 АЛьФ
 
07.04.26
15:15
+(46) Получается такой порядок:
- Нажимаем кнопку "Открыть ссылку авторизации" (вызывается КомандаАвторизация())
- в браузере открывается страничка авторизации Диадока, пользователь авторизуется, все подтверждает
- после этого тут же жмем кнопку "Заполнить токены" (вызывается КомандаЗаполнитьТокены())

В случае необходимости обновления жмем "Обновить токены" (вызывается КомандаОбновитьТокены()).
Завтра буду проверять как это все работает после истечения срока годности access_token.
48 Stepashkin
 
07.04.26
15:53
(47) 👍Спасибо. Буду использовать для автоматического подключения с вашего позволения.
49 1cVandal
 
08.04.26
10:21
схоронил
50 Stepashkin
 
08.04.26
15:21
(47) Ну как проверка? Прошла?
51 Garikk
 
08.04.26
15:44
(47) не забудь что у refresh токена тоже есть срок жизни и он тоже протухнуть может
52 АЛьФ
 
08.04.26
17:16
2(50) Сейчас обновились токены. Для чистоты эксперимента в пятницу еще попробую. Чтобы явно больше суток прошло.
2(51) Что-то не припомню, чтобы встречал упоминание об этом в документации.
53 PLUT
 
гуру
08.04.26
18:02
(52) я что-то там у гугла получал эти токены, когда ихний апи использовал для получения инфы по статистике

ну так вот, если токен протух, сервер шлёт в ответ ашипку - месседж определенный, по которому яснопонятно, что токен закончился и нужно запрашивать получение нового

у Контура должно быть примерно также?
54 АЛьФ
 
09.04.26
08:51
2(53) Может там и так, но в документации у них об этом ни слова.
55 PLUT
 
гуру
09.04.26
09:05
ИИчко пишет, что самое лучшее - запрашивать новый токен заранее, если известно время его выпуска
В Диадок API узнать, что время действия токена закончилось (истекло), можно по следующим признакам при выполнении запросов:

Код ответа HTTP 401 Unauthorized: Это основной признак. Если API возвращает код 401, это означает, что токен недействителен, просрочен или отсутствует.

Текст ошибки: В теле ответа на запрос с кодом 401 будет указано сообщение об ошибке, указывающее на необходимость повторной авторизации.

developer.kontur.ru
Рекомендации по работе с токенами:

Обработка 401 ошибки: Ваше приложение должно перехватывать код 401 и инициировать процедуру переавторизации (вызов метода Authenticate или AuthenticateConfirm) для получения нового токена.

Время жизни токена: Токены в Диадоке имеют ограниченное время жизни. Рекомендуется не полагаться только на ошибку 401, а обновлять токен заранее, если известно время его выпуска.

Повторная авторизация: Используйте методы Authenticate или AuthenticateConfirm для обновления токена.
56 Stepashkin
 
09.04.26
09:34
(55) У меня так сделано.
57 АЛьФ
 
09.04.26
11:12
2(55) Это все про access_token.
58 АЛьФ
 
10.04.26
16:52
Докладаю. С просроченным access_token обновление токенов прошло нормально.
Следующая проверка в понедельник.
Независимо от того, куда вы едете — это в гору и против ветра!