OTT-signature-interceptor#
Interceptor предназначен для подписи сообщения с помощью ОТТ-сервиса для контроля целостности сообщения.
ВАЖНО: Для взаимодействия с ОТТ-клиентом interceptor использует библиотеку
sbp.com.sbt.ott:ott-jsonrpc-hb-client:4.3.1-157. Данная библиотека относится к серверной части ОТТ (ОТТ-сервис). Подробнее описано в документации продукта Platform V One-Time-Token (OTT) и его компонента OTTS.
Принцип работы#
Producer-interceptor запрашивает token у централизованного сервиса ОТТ.
Producer-interceptor подписывает тело сообщения с помощью token.
Producer-interceptor добавляет подпись (в Base64) и token (в формате jws) в заголовки сообщения.
Consumer-interceptor получает token (в формате jws) из заголовка сообщения и проверяет его валидность.
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();