|
Нужна помощь с авторизацией 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 обновление токенов прошло нормально.
Следующая проверка в понедельник. |
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |