如何使用基本身份验证在Apache Knox中配置websocket服务

时间:2017-10-05 15:45:17

标签: websocket knox-gateway

我设法在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>

{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

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服务的最简单的可能配置不同:< / p>

<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>,它的语义是什么?它与 rewrite.xml 中的<rule>/<rewrite>相对应吗? request.url意味着什么?

1 个答案:

答案 0 :(得分:1)

很好的问题,不幸的是,Knox中的身份验证和授权机制基于Http servlet过滤器,它不适用于Websocket。

您可以做的一件事就是让HTTP端进行身份验证,然后打开websocket连接。

如果您愿意,可以为此增强功能打开JIRA

[编辑]

后续问题的答案

  1. 如果Websockets没有任何意义,它们是来自http
  2. 的工件
  3. 再次使用http上下文比使用websocket更好地解释重写。他们所做的是,告诉Knox何时应用重写规则,即request.url,request.body,response.url,response.body等。因为规则基于HTTP servlet过滤器,所以它们不用于重写websocket数据。我相信应该有一些JIRA在那里躺着。