Как настроить службу websocket в Apache Knox с базовой аутентификацией

Мне удалось настроить службу веб-сокетов в Knox, которая в тестовых целях ws://echo.websocket.org

Вот мои файлы конфигурации:

service.xml

<service role="ECHOWS" name="echows" version="0.0.1">
  <policies>
        <policy role="webappsec"/>
        <policy role="authentication" name="Anonymous"/>
        <policy role="rewrite"/>
        <policy role="authorization"/>
  </policies>
  <routes>
    <route path="/echows">
        <rewrite apply="ECHOWS/echows/inbound" to="request.url"/>
    </route>
  </routes>
</service>

rewrite.xml

<rules>
  <rule dir="IN" name="ECHOWS/echows/inbound" pattern="*://*:*/**/echows">
    <rewrite template="{$serviceUrl[ECHOWS]}"/>
  </rule>
</rules>

Раздел {topology} .xml:

<service>
    <role>ECHOWS</role>
    <url>ws://echo.websocket.org</url>
</service>

Я могу к нему подключиться:

wscat -c wss://my-knox-server/gateway/default/echows
connected (press CTRL+C to quit)
> Hello Knox!
< Hello Knox!

Но я бы хотел, чтобы Knox принимал соединение только при наличии надлежащих учетных данных:

wscat --auth <username:password> -c wss://my-knox-server/gateway/default/echows

Моя конфигурация Knox для служб http работает таким образом, что мне нужно указать учетные данные, иначе я получаю 401:

curl -i https://my-knox-server/gateway/default/my_service/ping
HTTP/1.1 401 Unauthorized

curl -i -u '<user>:<password>' https://my-knox-server/gateway/default/my_service/ping
HTTP/1.1 200 OK

Я бы хотел добиться того же результата с веб-сокетами.

[РЕДАКТИРОВАТЬ]

Более того, я не совсем понимаю приведенную выше конфигурацию service.xml для моей службы websocket, поскольку она отличается от простейшей возможной конфигурации службы http, которую я смог использовать:

<service role="MY_APP" name="my_app" version="0.0.1">
    <routes>
        <route path="/my_app/**"/>
    </routes>
</service>
  1. Зачем в случае службы websocket мне нужны policies и что они означают?
  2. Почему <routes>/<route> имеет элемент <rewrite> и какова его семантика? Соответствует ли он <rule>/<rewrite> из rewrite.xml? Что там request.url?

person tomek    schedule 05.10.2017    source источник


Ответы (1)


Хороший вопрос, к сожалению, механизм аутентификации и авторизации в Knox основан на фильтрах сервлетов Http, которые неприменимы для Websocket.

Одна вещь, которую вы можете сделать, - это иметь HTTP-сторону, которая выполняет аутентификацию, а затем открывает соединение с веб-сокетом.

При желании вы можете открыть JIRA для этого усовершенствования.

[РЕДАКТИРОВАТЬ]

Ответы на уточняющие вопросы

  1. В случае, если веб-сокеты не имеют значения, это артефакты из http.
  2. Опять же, in rewrites лучше объяснить с помощью контекста http, чем с помощью веб-сокета. Что они делают, так это сообщают Knox, когда применять правило перезаписи, то есть request.url, request.body, response.url, response.body и т. Д. Поскольку правила основаны на фильтрах сервлетов HTTP, они не используются для перезаписи данных веб-сокетов. Я считаю, что для этого должна лежать какая-то JIRA.
person Sandeep More    schedule 05.10.2017
comment
Почему фильтры сервлетов http не могут использоваться в случае соединений через веб-сокеты? Они инициализируются http-запросами, верно? - person tomek; 05.10.2017
comment
Что ж, как только протокол ws обнаружен, Knox использует обработчик websocket (используемый причалом), минуя фильтры сервлетов. - person Sandeep More; 05.10.2017
comment
Спасибо @SandeepMore, я добавил еще несколько вопросов, не могли бы вы их посмотреть? - person tomek; 06.10.2017