如何使用基本身份验证在 Apache Knox 中配置 websocket 服务
How to configure a websocket service in Apache Knox with basic authentication
我设法在 Knox 中配置了一个用于测试目的的 websocket 服务 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>
{拓扑结构}.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
我的 http 服务的 Knox 配置以这种方式工作,我必须输入凭据,否则我会收到 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
我想用 websockets 达到同样的效果。
[编辑]
此外,我不完全理解我的 websocket 服务的上述 service.xml 配置,因为它不同于我之前最简单的 http 服务配置可以使用:
<service role="MY_APP" name="my_app" version="0.0.1">
<routes>
<route path="/my_app/**"/>
</routes>
</service>
- 为什么我需要一个 websocket 服务
policies
,它们是什么意思?
- 为什么
<routes>/<route>
有一个元素 <rewrite>
,它的语义是什么?它对应于rewrite.xml中的<rule>/<rewrite>
吗? request.url
是什么意思?
好问题,不幸的是,Knox 中的身份验证和授权机制基于 Http servlet 过滤器,不适用于 Websocket。
您可以做的一件事是让 HTTP 端进行身份验证,然后打开 websocket 连接。
如果需要,您可以为此增强功能打开 JIRA。
[编辑]
后续问题的答案
- 如果 Websockets 没有意义,它们是来自 http
的工件
- 同样,使用 http 上下文比使用 websocket 可以更好地解释 in 重写。他们所做的是,告诉 Knox 何时应用重写规则,即 request.url、request.body、response.url、response.body 等。因为规则基于 HTTP servlet 过滤器,它们是不用于重写 websocket 数据。我相信应该有一些 JIRA 可以解决这个问题。
我设法在 Knox 中配置了一个用于测试目的的 websocket 服务 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>
{拓扑结构}.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
我的 http 服务的 Knox 配置以这种方式工作,我必须输入凭据,否则我会收到 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
我想用 websockets 达到同样的效果。
[编辑]
此外,我不完全理解我的 websocket 服务的上述 service.xml 配置,因为它不同于我之前最简单的 http 服务配置可以使用:
<service role="MY_APP" name="my_app" version="0.0.1">
<routes>
<route path="/my_app/**"/>
</routes>
</service>
- 为什么我需要一个 websocket 服务
policies
,它们是什么意思? - 为什么
<routes>/<route>
有一个元素<rewrite>
,它的语义是什么?它对应于rewrite.xml中的<rule>/<rewrite>
吗?request.url
是什么意思?
好问题,不幸的是,Knox 中的身份验证和授权机制基于 Http servlet 过滤器,不适用于 Websocket。
您可以做的一件事是让 HTTP 端进行身份验证,然后打开 websocket 连接。
如果需要,您可以为此增强功能打开 JIRA。
[编辑]
后续问题的答案
- 如果 Websockets 没有意义,它们是来自 http 的工件
- 同样,使用 http 上下文比使用 websocket 可以更好地解释 in 重写。他们所做的是,告诉 Knox 何时应用重写规则,即 request.url、request.body、response.url、response.body 等。因为规则基于 HTTP servlet 过滤器,它们是不用于重写 websocket 数据。我相信应该有一些 JIRA 可以解决这个问题。