Как настроить службу веб-сокетов в 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>
- Почему в случае службы websocket мне нужно
policies
и что они значат? - Зачем
<routes>/<route>
имеет элемент<rewrite>
и какова его семантика? Соответствует ли это<rule>/<rewrite>
из rewrite.xml? Что значитrequest.url
значит там?
1 ответ
Хороший вопрос, к сожалению, механизм аутентификации и авторизации в Knox основан на фильтрах сервлетов Http, которые не будут применимы для Websocket.
Одна вещь, которую вы можете сделать, это иметь сторону HTTP, которая выполняет аутентификацию, а затем открывает соединение через веб-сокет.
Если вы хотите, вы можете открыть JIRA для этого улучшения.
[РЕДАКТИРОВАТЬ]
Ответы на дополнительные вопросы
- В случае, если Websockets не имеют значения, они являются артефактами от http
- Опять же, в переписывается лучше объяснить с http-контекста, чем с websocket. Они сообщают Knox, когда следует применять правило перезаписи, т.е. request.url, request.body, response.url, response.body и т. Д. Поскольку правила основаны на фильтрах сервлетов HTTP, они не используются для перезаписи данных веб-сокетов. Я полагаю, что для этого должна быть какая-то джира.