Skip to end of metadata
Go to start of metadata

You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 12 Next »

Данный сценарий мы используем в том случае, если нам нужно совместить стандартные сценарии авторизации при помощи системных уведомлений и авторизацию через 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, поэтому для работы необходимо использовать клиентский токен

 КАК ПОД АГЕНТОМ ПОЛУЧИТЬ СПИСОК КОМАНИДРОВОК?
  1. Получить токен для агента

  2. Получить клиентский токен под агентом

  3. Отправить запрос с полученным клиентским токеном

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

 Пример запроса
<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>

  • No labels