OTT-signature-interceptor#

Interceptor предназначен для подписи сообщения с помощью ОТТ-сервиса для контроля целостности сообщения.

ВАЖНО: Для взаимодействия с ОТТ-клиентом interceptor использует библиотеку sbp.com.sbt.ott:ott-jsonrpc-hb-client:4.3.1-157. Данная библиотека относится к серверной части ОТТ (ОТТ-сервис). Подробнее описано в документации продукта Platform V One-Time-Token (OTT) и его компонента OTTS.

Принцип работы#

  1. Producer-interceptor запрашивает token у централизованного сервиса ОТТ.

  2. Producer-interceptor подписывает тело сообщения с помощью token.

  3. Producer-interceptor добавляет подпись (в Base64) и token (в формате jws) в заголовки сообщения.

  4. Consumer-interceptor получает token (в формате jws) из заголовка сообщения и проверяет его валидность.

  5. Consumer-interceptor получает подпись из заголовка сообщения и проверяет его валидность с помощью token.

ВАЖНО! При использовании ott-signature-interceptor возможно падение производительности передачи событий. Для установления конкретных показателей для определенного взаимодействия необходимо проведение НТ.

Конфигурация#

Для конфигурирования interceptor возможно сформировать файл *.properties с необходимыми параметрами.

ott-signature-interceptor поддерживает следующие параметры:

Настройка

Назначение

Дефолтное значение

Комментарии

signature.ott.module.id

Настройка OTT-клиента

-

Обязательная настройка

signature.ott.authz.realm

Настройка OTT-клиента

-

Обязательная настройка

signature.ott.config.root.dir

Настройка OTT-клиента

-

Обязательная настройка

signature.ott.token.header

Настройка имен системных заголовков

-

Опциональная

signature.ott.request.attribute.delim

Параметры запроса к ОТТ-сервису

#

Опциональная

signature.ott.request.invoker

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.receiver

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.url

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.domain

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.action

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.add.subject

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.add.recipient.subject

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.add.action

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.add.resource

Параметры запроса к ОТТ-сервису

-

Опциональная

signature.ott.request.add.environment.realm

Параметры запроса к ОТТ-сервису

-

Опциональная

Поведение при ошибках#

В случае, если сообщение не прошло проверку подписи при получении (на стороне consumer-interceptor), поведение настраивается с помощью параметра failMode:

  • filter: сообщение об ошибке будет залогировано в error, клиент не получит невалидное сообщение;

  • fail: будет выброшено исключение типа ru.sbt.ss.artemis.interceptor.exception.ArtemisSignatureException, клиент не получит сообщение.

Примеры подключения interceptor к core-клиенту#

Подключение исходящего OTT-signature-interceptor на producer#

OttSignatureInterceptor outgoingInterceptor = OttSignatureInterceptor.newBuilder()
        .setModuleIdKey("moduleId")
        .setAuthzRealmKey("realmKey")
        .setConfigRootDir("rootDir")
        ... other settings
        .build();

ServerLocator locator = ActiveMQClient.createServerLocator("tcp://host::port?TranspotConfiguration");

locator.addOutgoingInterceptor(outgoingInterceptor);
ClientSessionFactory factory =  locator.createClientSessionFactory();
ClientSession session = factory.createSession();

// addressName=example, queueName=example 

ClientProducer producer = session.createProducer("example");

ClientMessage message = session.createMessage(Message.TEXT_TYPE, config.durable);
TextMessageUtil.writeBodyText( ((CoreMessage) clientMessage).getBodyBuffer, "Hello");

producer.send(message);

Подключение входящего OTT-signature-interceptor на consumer#

OttSignatureInterceptor incomingInterceptor = OttSignatureInterceptor.newBuilder()
        .setModuleIdKey("moduleId")
        .setAuthzRealmKey("realmKey")
        .setConfigRootDir("rootDir")
        ... other settings
        .build();

ServerLocator locator = ActiveMQClient.createServerLocator("tcp://host::port?TranspotConfiguration");

locator.addIncomingInterceptor(incomingInterceptor);
ClientSessionFactory factory =  locator.createClientSessionFactory();
ClientSession session = factory.createSession();

// addressName=example, queueName=example

ClientConsumer consumer = session.createConsumer("example");
session.start();
ClientMessage msgReceived = consumer.receive();