Skip to content

Внешние виджеты

Концепт:

Host = Bs.UI (приложение в которое встраивается iframe)

Plugin - любая страница, которая может включать в себя plugin-sdk.js для общения с хостом, но может быть полностью статичная

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

json
{
  "status": "ok",
  "timestamp": 1522615252240,
  "data": {
    "redirectTo": "https://some-widget?_user_bsauth=encrypt(request()->header('bsauth'))"
  }
}

Внешний сервис должен взять на себя хранение сессии, например в redis хранить ключ, по которому будет получен весь контекст запроса. Временные key-value db удобны в отсутствии криптографии и автоматически протухающих ссылках.

Host запрашивает сервис по ссылке href передавая контекст в get параметрах

Например, итоговая ссылка на запрос будет http://whatever/api/init-collateral-widget?id=123&targetOrigin=http...

id = ид сущности контекста

targetOrigin = ссылка в хост для отправки событий. Если js sdk не используется, то можно игнорировать

{
    "status": "ok",
    "timestamp": 1522615252240,
    "data": {
        "redirectTo": "http://whatever/view-collateral-widget?sessionId=aaaaaaaaaaaaaaaaa123"
    }
}

PS. после внедрения SSO схема сохранит обратную совместимость

Настройка Bs.UI

settings/ExtraServices.xml

xml
<?xml version="1.0" encoding="UTF-8" ?>
<settings>
  <services>
    <service
      authenticate="true"
      entity="collateral"
      code="demo"
      href="http://whatever/api/init-collateral-widget"
      purpose="sidebar"
	>Название виджета залогов</service>
  </services>
</settings>

service.authenticate="true" (будет ли отправлен bsauth при инициализации сессии) service.entity="collateral" (сущность в контексте которой работает виджет) service.code="demo" (уникальное кодовое название виджета) service.href="http://whatever/api/init-collateral-widget" (ссылка на инициализацию) service.purpose="sidebar" (назначение виджета, влияет на его отображение и положение)

Примеры

Пример plugin страницы с возможностью отправки событий в host

html
<!doctype html>
<html lang="en">
  <head>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.0/dist/css/bootstrap.min.css" />
  </head>
  <body>
    <p>
      <a href="#" class="btn btn-primary" onclick="BS_SDK.navigate.client(123)">BS_SDK.navigate.client(123)</a>
      <a href="#" class="btn btn-primary" onclick="BS_SDK.navigate.loanApp(123)">BS_SDK.navigate.loanApp(123)</a>
    </p>
    <p>
      <a href="#" class="btn btn-warning" onclick="BS_SDK.notifications.success('success')"
        >BS_SDK.notification.success('success')</a
      >
      <a href="#" class="btn btn-warning" onclick="BS_SDK.notifications.info('info')"
        >BS_SDK.notification.info('info')</a
      >
    </p>

    <script src="https://cdn.brainysoft.ru/sdk/sdk-plugin/1.0/index.js"></script>

    <script>
      (function () {
        consttargetOrigin = new URLSearchParams(window.location.search).get('_target_origin');
        window['BS_SDK'].setTargetOrigin(targetOrigin);
      })();
    </script>
  </body>
</html>