Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

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

...

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

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

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

...

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

...

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

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

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

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

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

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

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

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

Code Block
languagec#
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 – дата “по“ периода

Вопросы:

Expand
titleПОЧЕМУ ПУСТОЙ ОТВЕТ ПРИ ЗАПРОСЕ С АГЕНТСКИМ ТОКЕНОМ?

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

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

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

  3. Отправить запрос

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

Expand
titleПример запроса
Code Block
<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>
Image AddedImage Added

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

Expand
titleПример ответа
Code Block
<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>
Image Added

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

Expand
titleПример ошибки авторизации
Code Block
<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>
Image Added