/
Мод "Авторизация командировок" - сценарий с работой через API

Мод "Авторизация командировок" - сценарий с работой через API

Данный сценарий мы используем в том случае, если нам нужно совместить стандартные сценарии авторизации при помощи системных уведомлений и авторизацию через API. Для такого решения мы используем специальную настройку, которую можно установить на любом уровне авторизации, например, в приведенном ниже примере мы сначала авторизуем заказ в Кортеос, а потом делаем авторизацию в какой-то внешней системе при помощи API.

Настройка схемы авторизации

В этом примере, после того, как авторизация первого уровня будет пройдена по правилу одной подписи, по адресу http://listener.corteos.ru/Home/Listen - можно использовать в том числе и для ваших тестов, - будет отправлен запрос такого вида:

 

{ "id_Complex": 1123333, "hash": "asda3124r4ndasdas23321aas", "id_Auth": 1111 }

На самой странице редактирование указано описание возможных переменных:

  • @id_ComplexReserve - номер авторизуемой командировки, предназначен для выгрузки при помощи метода SOAP API GetReservationDetails

  • @id_Authorization - идентификатор уровня авторизации, нужно передавать обратно при вызове метода согласования

  • @hash - подпись запроса для проверки целостности, следует передавать обратно при вызове метода согласования

Использование в рабочем процессе

В командировке, к который применима наша схема авторизации, запускаем процесс согласования стандартным способом:

Далее мы видим в списке авторизующих лиц такую запись:

После того, как подпись согласующего лица на первом уровне была получена, осуществляется обращение ко внешней системе через API в рамках настроенного выше процесса:

Мы видим, что обращение к сервису произошло ровно в том момент, когда согласующее лицо согласовало командировку, если бы вместо этого произошло отклонение командировки, то обращение во внешюю систему не было бы отправлено и заказ вернулся бы в состояние черновика.

В указанном примере мы видим параметры, которые Кортеос передал во внешнюю систему, далее их следует использовать в веб-сервисе согласования.

Пример полученных в callback данных:

{ "id_Complex": 766711, "hash": "74829afd1d451bb43b3c5d299bd5411c", "id_Auth": 417303 }

После получения данного уведомления можно выгрузить детали командировки при помощи метода API: Универсальный метод выгрузки заказа или командировки

Веб-сервис для согласования

Для согласования используется веб-сервис: /PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx

WSDL: https://jv3.corteos.ru/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx?WSDL

В сервис необходимо передать следующие поля:

  • id_Authorization - int, первичный ключ согласования, получаем из коллбэка на авторизацию(см. выше)

  • IsSucceed - bool, статус согласования, true - согласовать, false - отклонить

  • Comment - string, текстовое пояснение к операции, будет выведено в деталях командировки в таблице согласований

  • Hash - string, подпись запроса, также получаем из коллбэка(см.выше)

В ответе на этот запрос мы получаем XML такого вида:

 

<ComplexAuthAPIResponse xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="https://corteos.ru/" id_ComplexReserve="766711" State="Finished" AuthorizationSucceed="true"> <ComplexReserveName>Тест авторизации</ComplexReserveName> </ComplexAuthAPIResponse>

В случае ошибки согласования мы получим SOAP Exception:

 

JavelinBL2.Exceptions.UserFriendlyException: В настоящий момент по данной командировке авторизация не проводится, поэтому Вы не можете её авторизовать.

Внешний вид таблицы согласований для согласованной через API командировки:

Использование веб-сервиса из мода Авторизация командировок через API

Альтернативно вместо основного веб-сервиса можно использовать веб-сервис, описанный в приведенном ниже документе.

"Авторизация командировок через API"(ModExternalAuth)

в методе мода Авторизации командировок через API есть такие параметры, которые надо заменить следующим образом:

  • int id_ComplexReserve - тут передаем не id_ComplexReserve, а id_Auth из коллбэка

  • bool authorize - true или false - согласовать или отклонить

  • string hash - должен быть в специальном формате, “COMPLEXAUTH-{оригинальных хэш}”, в этом случае пойдет обращение к методу сложной авторизации

Реализация данного сценария к коде ModExternalAuth

Match m = Regex.Match(hash, "COMPLEXAUTH-(.+)", RegexOptions.IgnoreCase); if (m.Success) { var svc = new ComplexAuthWS.ComplexAuthAPI(); svc.Url = CurrentWebSite.CurrentEnvironment.CurrentWebSiteUrl + "/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx"; svc.Authorize(id_Authorization: id_ComplexReserve, IsSucceed: authorize, Comment: authorize ? "согласовано" : "не согласовано", Hash: m.Groups[1].Value); return "ok"; }

Веб-сервис для получения списка командировок, по которым была запрошена авторизация в заданный период 08.02.2022

Для получения списка необходимо использовать веб-сервис: YourDomain/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx

WSDL: YourDomain/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx?WSDL

Метод: YourDomain/PortableViews/ModComplexAuthViews/API/ComplexAuthAPI.asmx?op=GetComplexReservesByStartAuth

Параметры:

  • string Token – токен клиента

  • DateTime dateFrom – дата “с“ периода

  • DateTime dateTo – дата “по“ периода

Вопросы:

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

Пример запроса:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:cor="https://corteos.ru/"> <soapenv:Header> <cor:AuthHeader> <cor:Token>190e4bf1-****-****-971a-7e7e2dbeb415</cor:Token> </cor:AuthHeader> </soapenv:Header> <soapenv:Body> <cor:GetComplexReservesByStartAuth> <cor:dateFrom>2021-11-26T10:00:00</cor:dateFrom> <cor:dateTo>2021-11-26T15:00:00</cor:dateTo> </cor:GetComplexReservesByStartAuth> </soapenv:Body> </soapenv:Envelope>

 

Пример ответа:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <GetComplexReservesByStartAuthResponse xmlns="https://corteos.ru/"> <GetComplexReservesByStartAuthResult> <ComplexAuth id_ComplexReserve="774417" id_Authorization="419901" Hash="61b5b5e65a8bf191f6ac83eee6c54e97"/> <ComplexAuth id_ComplexReserve="774417" id_Authorization="419902" Hash="e4446c6dfd71775907d927c60b2c004e"/> </GetComplexReservesByStartAuthResult> </GetComplexReservesByStartAuthResponse> </soap:Body> </soap:Envelope>

 

Пример ошибки:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <soap:Body> <soap:Fault> <faultcode>soap:Server</faultcode> <faultstring>System.Web.Services.Protocols.SoapException: Серверу не удалось обработать запрос. ---> System.Exception: Авторизация по токену Ошибка при получении контроллера бизнес-логики: Токен 190e4bf1-****-****-971a-7e7e2dbeb415 не найден в системе, необходимо пройти авторизацию повторно. в JavelinView3.Base.WebServices.BaseV3WebService.GetBLController(Guid token, Boolean createNewInstance) в C:\Projects\jv3\JavelinView3.Base\WebServices\_Common\Code\BaseWebService.cs:строка 291 в JavelinView3.Base.WebServices.BaseV3WebService.GetBLController(Guid token, Boolean createNewInstance) в C:\Projects\jv3\JavelinView3.Base\WebServices\_Common\Code\BaseWebService.cs:строка 348 в JavelinView3.Base.WebServices.BaseV3WebService.TryAuthFromHeaders(Boolean createNewControllerInstance) в C:\Projects\jv3\JavelinView3.Base\WebServices\_Common\Code\BaseWebService.cs:строка 199 в ModComplexAuth.PortableViews.ModComplexAuthViews.API.ComplexAuthAPI.GetComplexReservesByStartAuth(DateTime dateFrom, DateTime dateTo) в C:\Projects\jv3\ModComplexAuth\PortableViews\ModComplexAuthViews\API\ComplexAuthAPI.asmx.cs:строка 81 --- Конец трассировки внутреннего стека исключений ---</faultstring> <detail/> </soap:Fault> </soap:Body> </soap:Envelope>

 

 

Related content