Вопрос

Возможно ли использование JWT авторизации для подключения веб сервиса, а так же для доступа к API BPM?

У меня такой же вопрос

1 комментарий

Нет, JWT не поддерживается. 

При интеграции bpm’online с веб-сервисами поддерживается два типа аутентификации: базовая и OAuth 2.0.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Коллеги всем доброго времени суток. Нужна Ваша помощь.

В БП есть элемент Web-сервис в  котором есть массив - http://prntscr.com/kyim63.
Данный массив объектов состоит из двух полей Number и Description - http://prntscr.com/kyimnk
Данные поля необходимо заполнять по следующему правилу из двух выборок - http://prntscr.com/kyin8y
Правила заполнения реализовал следующим образом через тернальные выражения в формуле поля - http://prntscr.com/kyio17http://prntscr.com/kyioa3
Но при отработке элемента Web-сервис видим что массив Communications пустой - http://prntscr.com/kyip7z
Если же посмотреть на данные трассировки двух элементов из которых должна осуществляться выборка видим:
Идем в "Читать Контакты СТО в платформе" - http://prntscr.com/kyiq70 здесь по нулям следовательно логике должно брать значение из другого элемента, идем в "Читать Основной контакт Контрагента" - http://prntscr.com/kyir2v, здесь данные есть, вопрос почему не заполнились в веб-сервисе?
Заранее благодарю за ответ.

У меня такой же вопрос

1 комментарий

Нужно ещё больше ссылок на prntscr.com.angry

В 7.12 поддержка работы с веб-сервисами из БП только появилась. В 7.13 обещают усовершенствовать, улучшить работу в том числе и с массивами. Есть смысл дождаться релиза и переделать с учётом его возможностей.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Товарищи помогите.

БЦ  дергает код на сервере, этот код забирает данные из другой системы и обновляет запись контрагента путем прямого SQL запроса.

Все работает  но проблема с обновление пользовательского интерфеса.(Ну тобишь пользователь должен в интерактиве увидеть результат). Сейчас  я в клиенском коде кручу в потоке jQuery таймер и тыкаюсь в БД проверяя наличие изменений и вывожу диалоговое окошко. Но данный подход, мне уж больно не нравится.

Есть ли способ из внешней системы путем сетевого запроса, вывести модальное окно у конкретного пользователя? Или какие иные подходы существуют

 

У меня такой же вопрос

2 комментария
Лучший ответ

Чисто в теории:

- код на сервере помимо sql-вставок, генерирует сигнал по web-socket, что изменена запись

-на клиенте развернуть listener, будет принимать сигнал, выдавать пользователям сообщение

Чисто в теории:

- код на сервере помимо sql-вставок, генерирует сигнал по web-socket, что изменена запись

-на клиенте развернуть listener, будет принимать сигнал, выдавать пользователям сообщение

Спсб

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Интересует несколько вопросов, связанных с использованием web-сервисов:

1) Доступна ли  basic авторизация  для ProcessEngineService.svc а так же для кастомных конфигурационных сервисов? 

2) И если 1- да, то как правильно передать параметры авторизации?

Использую вебсервис так:

http://site/0/ServiceModel/ProcessEngineService.svc/RunProcess

{"parameterValues":
[
{"name":"Title","value":"TestValue1"},
{"name":"Description","value":"TestValue2"},
{"name":"Action","value":"TestValue3"}
],
"schemaUId":"AF7E3F40-0EFA-431A-94AA-4DEEFFE16E59",
"schemaName":"UsrCaseIntegrationProcess"}

 

У меня такой же вопрос

9 комментариев

С авторизацией разобрался

Появился новый вопрос - как вернуть результат выполнения процесса. Как проавильно прописать в POST запрос ResultParameterName

Бакалов Павел Вячеславович,

Убедитесь, что процесс компилируемый, потому что получить значение ResultParameterName можно только для компилируемого процесса.

Примеры запроса есть тут: https://academy.terrasoft.ru/documents/technic-sdk/7-12/web-servis-proc…

 

Tsopa,

Да, процесс компилируемый. Руководствуясь данной инструкции удалось выполнить процесс, передать параметры и получить результат используя метод GET. Но в инструкции написано, что так же можно использовать метод POST. Но у меня не вышло это сделать - процесс выполнился, но параметры в него не попали и результат соответственно не вернулся. Нет ли примеров POST запросов к методу Execute ?

Вот с постом.

Зверев Александр,

Александр, спасибо конечно, но это метод RunProcess, который я привел в самом начале своего поста. А меня интересует вызов метода Execute, так как в нем есть возможность вернуть результат выполнения процесса в виде параметра процесса.

Бакалов Павел Вячеславович,

POST запрос к методу Execute  не рекомендуется отправлять, поскольку  операция устарела, вместо этого стоит отправлять запрос /RunProcess.

Но если необходимо отправить POST запрос к Execute это можно сделать следующим образом: 

schemaName - эта название схемы процесса, который необходимо запустить

https://[site]/0/ServiceModel/ProcessEngineService.svc/[schemaName]/Execute

пример Header: 

Content-Type: application/json
BPMCSRF: BgsjByc16fsEZfuAr/CxDO
Cookie: BPMLOADER=vuhtzmo2wh2mxgb1amggorf2; .ASPXAUTH=FFF4F....; BPMCSRF=BgsjByc16fsEZfuAr/CxDO;

пример body: 

{}

 

как Вы решили проблему Basic авторизации?

См. тут. А вообще, базовую не рекомендуют, вот её сравнение с Cookies.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Столкнулся со следующей ситуацией: 
При запросе авторизации к AuthService через fiddler возвращаются данные BPMCSRF, и при запросе к кастомному сервису указывая данный аттрибут в хэдере запроса получаю ответ 200, ок.
Однако, при программном вызове AuthService через метод, предоставленный на статье академии (TryLogin) и при запросе к сервису с данными Cookie получаю ответ 403 - запрещено. Ошибка возникает, т.к. нет отдельного хэдера BPMCSRF содержащего значения из Cookie.

Вопрос, как добавить данные  BPMCSRF в запрос программно?

У меня такой же вопрос

2 комментария

Здравствуйте, Дмитрий.

Вы должны из кук получить параметр, и добавить его в хедер:

 CookieCollection cookieCollection = AuthCookie.GetCookies(new Uri(authServiceUri));
    string csrfToken = cookieCollection["BPMCSRF"].Value;
    ((HttpWebRequest)e.Request).Headers.Add("BPMCSRF", csrfToken);

Детали по ссылке - https://academy.terrasoft.ru/documents/technic-sdk/7-12/zashchita-ot-cs…

Сергей Кy6риш,

Сергей, спасибо, все получилось.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Здравствуйте!

Не могу получить конкретную системную настройку из клиентского кода (ошибка на скриншоте) на пользователях-аутсорсерах (не входят в роль "Все сотрудники компании", если это важно). При этом эта же настройка нормально загружается для остальных пользователей, этот же пользователь нормально получает другие настройки. Пересоздавать настройку пробовал, не помогает. В чем может быть дело/как починить?

У меня такой же вопрос

3 комментария

Здравствуйте!

Уточните, пожалуйста, как именно Вы получаете значение системной настройки? Есть листинг кода? 

 

Вильшанский Дмитрий, 

this.Terrasoft.SysSettings.querySysSettingsItem('SlaCalculationEnabled', function (slaEnabled) {console.log(slaEnabled)})

При этом если запросить какую-нибудь несуществующую настройку, то ошибка не выводится, приходит просто undefined

Добрый день.

Ошибка не совсем правильно передает суть проблемы. Дело в правах – т.е. у пользователя нет прав на данную настройку.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день, Коллеги.

Имел ли кто дело с реализацией анонимной аутентификации внешних запросов, например, к написанному Вами web-сервису по аналогии с сервисом оценок обращений?

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

У меня такой же вопрос

1 комментарий

Добрый день, Михаил.

Этот функционал разработан для продукта Service, соответственно требует наличия этого продукта в Вашей системе. Инструкция по настройке веб-сервисов, доступных без авторизации:

 

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

  • в WebApp\ServiceModel зарегистрировать веб-сервис, в котором будет указан путь к конфигурационному веб-сервису. Например, <Название сервиса>.svc, с содержимым:
<%@ ServiceHost Language="C#" Debug="true" Service="Terrasoft.Configuration.<Название сервиса>" %>
  • в WebApp\Web.config добавить:
<location path="ServiceModel/<Название сервиса>.svc">
  <system.web>
    <authorization>
      <allow users="*" />
    </authorization>
    </system.web>
</location>
  • в WebApp\Web.config секции appSettings изменить значение ключа AllowedLocations. В значение добавить:
ServiceModel/<Название сервиса>.svc
  • в конфигурации реализовать веб-сервис. Например:
namespace Terrasoft.Configuration 
{
         using System;
         using System.Runtime.Serialization;
         using System.ServiceModel;
         using System.ServiceModel.Activation;
         using System.ServiceModel.Web;
         using System.Web;
         using Terrasoft.Core;
         using Terrasoft.Web.Common;

 
         [ServiceContract]
         [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
         public class ConfigurationService : BaseService
         {

 
                 private SystemUserConnection _systemUserConnection;
                 private SystemUserConnection SystemUserConnection {
                          get {
                                   return _systemUserConnection ?? (_systemUserConnection = (SystemUserConnection)AppConnection.SystemUserConnection);
                          }
                 }

 
                 [OperationContract]
                 [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Post() {
                 }

 
                 [OperationContract]
                 [WebGet(RequestFormat = WebMessageFormat.Json, BodyStyle = WebMessageBodyStyle.Wrapped, ResponseFormat = WebMessageFormat.Json)]
                 public void Get() {
                 }
         }
}
  • в WebApp\ServiceModel\http|https\services.config добавить:
<service name="Terrasoft.Configuration.<Название сервиса>">
  <endpoint name="<Название сервиса>EndPoint"
    address="" 
    binding="webHttpBinding"
    behaviorConfiguration="RestServiceBehavior"
    bindingNamespace="http://Terrasoft.WebApp.ServiceModel"
    contract="Terrasoft.Configuration.<Название сервиса>" />
</service>

Сервис будет доступен по адресу WebApp/<Номер конфигурации>/ServiceModel/<Название веб-сервиса>.svc/<Название веб-метода>

Т.к. пользователь не авторизирован, то UserConnection не будет проинициализирован (Session["UserConnection"] == null).

 

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день!

Реализовал простейший Wcf сервис в BPM Online. Прописал все конфиги, по ссылке стало доступно описание сервиса http://localhost:89/0/ServiceModel/NewWebService.svc.

Создал консольное клиентское приложение, привожу код ниже. Получаю данные авторизации CookieContainer согласно примеру на академии. А вот дальше в ответ на запрос получаю ошибку: Удаленный сервер возвратил ошибку:403 запрещено. При этом аналогичный сервис размещенный в IIS работает корректно. Подскажите, как можно решить проблему.

Console.WriteLine("Успешна ли аутентификация?: {0}", TryLogin("Supervisor", "Supervisor"));

                string uri = "http://localhost:89/0/ServiceModel/NewWebService.svc/getCurrencyList";

                var currencyRequest = new NewWebService.request();
                currencyRequest.Id = "22";
                currencyRequest.operation = "getCurrencyList";
                currencyRequest.getCurrencyListParameters = new List<currency>();
                XmlSerializer serializer = new XmlSerializer(typeof(NewWebService.request));

                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.CookieContainer = AuthCookie;
                //request.KeepAlive = true;
                request.Method = "POST";
                request.ContentType = "text/xml";
                using (Stream requestStream = request.GetRequestStream())
                {
                    serializer.Serialize(requestStream, currencyRequest);
                }
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                using (Stream responseStream = response.GetResponseStream())
                {
                    var responseStr = new StreamReader(responseStream).ReadToEnd();
                    responseStr = HttpUtility.HtmlDecode(responseStr);
                    XmlSerializer deserializer = new XmlSerializer(typeof(CurrencyServiceResponse.Response));
                    using (TextReader reader = new StringReader(responseStr))
                    {
                        var responseObj = (CurrencyServiceResponse.Response)deserializer.Deserialize(reader);
                    }
                }               
                response.Close();

У меня такой же вопрос

10 комментариев

Добрый день, Дмитрий!

Система может возвращать 403 на POST запросы в случае есть в Web.config включен UseCsrfToken

 <add key="UseCsrfToken" value="true" />

Тогда хедер http запроса должен выглядеть следующим образом:

Если это локальная разработка, и нет необходимости в csrf-защите, то можно отключить UseCsrfToken. (https://academy.terrasoft.ru/documents/technic-sdk/7-11/zashchita-ot-cs…)

Добрый день! Отключил в конфиге UseCsrfToken и теперь по ссылке http://localhost:89/0/ServiceModel/NewWebService.svc в браузере отображается ошибка: Сайт localhost выполнил переадресацию слишком много раз. Вернул конфиг на исходное значение, ошибка сохранилась.

Теперь сервис вновь доступен, запрос из клиента возвращает 400. Csfr отключен.

При запросе из fiddler вовращает 302.

a6
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/0/ServiceModel/NewWebService.svc/getCurrencyList">here</a>.</h2>
</body></html>
 

 

Ошибка 400 - это Bad Request. У вас что-то не так с вызовом. Без описания сервиса и его метода сложно судить. Попробуйте создать отдельно WCF Service Application с вашим сервисом и потестируйте на нем

Через WCF Service Application развернутый в IIS работает. Описание сервиса и методов ниже.

//[ServiceBehavior(AddressFilterMode = AddressFilterMode.Any)]
public class NewWebService : INewWebService
    {
        public ResponseData Auth(RequestData RequestData)
        {
            var data = RequestData.details.Split('|');
            var response = new ResponseData
            {
                Name = data[0],
                Age = data[1],
                Exp = data[2],
                Technology = data[3]
            };
            return response;
        }

        public response GetCurrencyList()
        {
            var resp = new response();
            resp.value = "<getCurrencyList><CurrencyList><externalId>EUR</externalId><isoCode>978</isoCode><isoTxt>EUR</isoTxt><cb>571.25</cb><sell>580</sell><buy>568</buy><CshSell>580</CshSell><CshBuy>568</CshBuy><CshBuyTrf>568.5</CshBuyTrf><name><translation lang=\"ru\" value=\"ЕВРО\" /><translation lang=\"en\" value=\"\" /><translation lang=\"am\" value=\"ԵՎՐՈ\" /></name><country /></CurrencyList><CurrencyList><externalId>RUR</externalId><isoCode>643</isoCode><isoTxt>RUR</isoTxt><cb>8.31</cb><sell>8.4</sell><buy>8.18</buy><CshSell>8.4</CshSell><CshBuy>8.18</CshBuy><CshBuyTrf>8.23</CshBuyTrf><name><translation lang=\"ru\" value=\"Российский рубль\" /><translation lang=\"en\" value=\"Russian ruble\" /><translation lang=\"am\" value=\"Ռուսական ռուբլի\" /></name><country>RUS</country></CurrencyList><CurrencyList><externalId>USD</externalId><isoCode>840</isoCode><isoTxt>USD</isoTxt><cb>478.39</cb><sell>480</sell><buy>477</buy><CshSell>480</CshSell><CshBuy>477</CshBuy><CshBuyTrf>477.5</CshBuyTrf><name><translation lang=\"ru\" value=\"Доллар США\" /><translation lang=\"en\" value=\"US dollar\" /><translation lang=\"am\" value=\"ԱՄՆ դոլար\" /></name><country>USA</country></CurrencyList><errorCode>0</errorCode></getCurrencyList>";
            return resp;
        }
    }

    [ServiceContract]
    [XmlSerializerFormat]
    public interface INewWebService
    {
        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "auth")]
        ResponseData Auth(RequestData rData);

        [OperationContract]
        [WebInvoke(Method = "POST", RequestFormat = WebMessageFormat.Xml, ResponseFormat = WebMessageFormat.Xml, UriTemplate = "getCurrencyList")]
        response GetCurrencyList();
    }
}

Артем Гура,

Плюс при переходе в браузере по ссылке на сервис размещенный в IIS открывается страница Запрещенный метод, а на сервис размещенный в BpmOnline Http Error 400.

Тетиков Дмитрий Владимирович,

Разница между сервисом в IIS и в bpmonline в том что bpmonline необходимо пройти авторизацию и отправлять дополнительные токены и куки в хедере запроса.

Тут можно посмотреть примеры отправки запросов из Fiddler: https://academy.terrasoft.ua/documents/technic-sdk/7-11/vypolnenie-zapr… 

По аналогии вы можете отправлять запросы на NewWebService.svc

Еще раз хочу обратить внимание на хедер запроса: 

 

Проблема была в неверном конфиге. 
<service behaviorConfiguration="BaseServiceBehavior" name="CurrencyService.NewWebService">
При объявлении сервиса в аттрибуте name прописал название интерфейса, а не класса - сервиса.
Спасибо за рекомендации, теперь все работает корректно.

Tsopa,

В продолжение темы, подскажите пожалуйста, как сформировать запрос с Basic авторизацией. 

Отправляю в таком виде:

POST http://localhost:89/0/ServiceModel/NewWebService.svc/auth HTTP/1.1
Accept: text/xml
Content-Type: text/xml
Authorization: Basic U3VwZXJ2aXNvcjpTdXBlcnZpc29y 
Host: localhost:89
Content-Length: 191

<?xml version="1.0"?>
<RequestData xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <details>Ivan|29|3years|C#</details>
</RequestData>

Получаю вот такой ответ:
 

HTTP/1.1 302 Found
Cache-Control: private
Transfer-Encoding: chunked
Content-Type: text/html; charset=utf-8
Location: /0/ServiceModel/NewWebService.svc/auth
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
Set-Cookie: BPMSESSIONID=j22z5jiyd4njspgjq0tc32d0; path=/0; HttpOnly
Set-Cookie: .ASPXAUTH=; expires=Mon, 11-Oct-1999 19:00:00 GMT; path=/; HttpOnly
X-Powered-By: ASP.NET
X-Frame-Options: SAMEORIGIN
Date: Tue, 30 Jan 2018 09:06:22 GMT

9b
<html><head><title>Object moved</title></head><body>
<h2>Object moved to <a href="/0/ServiceModel/NewWebService.svc/auth">here</a>.</h2>
</body></html>

0
 

Тетиков Дмитрий Владимирович,

Используя Basic аутентификацию можно обратиться только к EntityDataservice.svc. Для всех остальных внешних запросов рекомендуется использовать AuthService.svc и соответствующие Cookie.

Больше информации можно получить тут: https://academy.terrasoft.ru/documents/technic-sdk/7-11/autentifikaciya…

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Добрый день.
Возможно ли реализовать механизм Webhooks на основании web-сервисов BPMonline?
Имеется в виду отправка запросов из сторонних сервисов на определённый url Bpmonline .

На данный момент в качестве основного препятствия вижу необходимость дополнительного запроса на авторизацию перед отправкой основного запроса. 
А внешний сервис со своей стороны может принять только один url для отправки запроса.

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

У меня такой же вопрос

5 комментариев

Добрый день. В продукте Marketing был реализован функционал WebHooks для получения откликов, открытий от Mandrill.

Чубко Илья, добрый день
Если я не ошибаюсь, то описанный вами механизм работает в обратном порядке, т.е. в BPMonline вызываются Webhooks стороннего сервиса.
У меня же задача кардинально противоположная: вызывать webhooks bpmonline из стороннего сервиса.

 

вижу несколько способов:

1) Как вы  и написали в посте: сторонний сервис авторизуется и потом посылает данные в bpm. В данном случае надо всего лишь написать веб-сервис.

2) Веб-сервис без авторизации. Т.е всё то же самое, что и в 1 пункте, только надо перекопать web.config bpm и добавить в сервисы пару файлов. Ну и в итоге получается тот же веб-сервис, только к нему не надо авторизовываться.

3) web-to-object. Я так понял можно зарегистрировать внешнюю систему и создавать простые объекты(не полноценный сервис, но может кому-то нужен только функционал создания новых записей).

Коновалов Игорь,

Нет же, сервер Mandrill отправляет webhooks на систему. Зачем системе отправлять себе же и тем более как узнать статус webhooks, в отличии от Mandrill

Добрый день. Приведу пример настройки веб-сервиса без авторизации на примере настройки для нашего конвектора с Jivosite. https://drive.google.com/file/d/0B9WlZhrEuJlkaGlkZ194c3Utbmc/view?usp=s…

Посмотрите здесь. Данная инструкция открывает доступ без авторизации к созданному вами сервису (естественно его нужно сначала создать). В самом сервисе вы реализуете вызываемую логику и шлете данные с внешнего источника обычным post запросом.

Войдите или зарегистрируйтесь, чтобы комментировать
Вопрос

Вот такой пример кода:


$soap = new SoapClient('http://crmserver/Terrasoft/TSWebServicesServerLibrary.dll/wsdl/IServer');
$wc = $soap->OpenConfiguration('Наша конфигурация', 'username', 'password',0);
$soap->CloseConfiguration($wc['ASessionUID']);
?>

Падает с ошибкой:

Fatal error: Uncaught SoapFault exception: [SOAP-ENV:Server] Catastrophic failure in test.php:4
Stack trace:
#0 [internal function]: SoapClient->__call('CloseConfiguration...', Array)
#1 test.php(4): SoapClient->CloseConfiguration('0008DC3345AB512...')
#2 {main}

Ответ сервера:

version="1.0"?>
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/">
        >

                >

                        />
                        >
SOAP-ENV:Server>
                        >Catastrophic failure>
                >
        >
>

Возможно, не хватает каких-то прав на сервере? каких?
Сервер IIS+Oracle, клиент FreeBSD

Виндовый клиент через SOAP работает отлично, только медленно.

У меня такой же вопрос

2 комментария

Имя конфигурации - русскими буквами. Может быть, в этом дело?

Вопрос закрыт. Действительно проблема была в русском имени конфигурации.

Войдите или зарегистрируйтесь, чтобы комментировать