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

如何使用基本身份验证在ApacheKnox中配置websocket服务,websocket,knox-gateway,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="A

我设法在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>
<rules>
  <rule dir="IN" name="ECHOWS/echows/inbound" pattern="*://*:*/**/echows">
    <rewrite template="{$serviceUrl[ECHOWS]}"/>
  </rule>
</rules>

rewrite.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>
<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>

埃克沃斯
ws://echo.websocket.org
我可以连接到它:

wscat -c wss://my-knox-server/gateway/default/echows
connected (press CTRL+C to quit)
> Hello Knox!
< Hello Knox!
wscat-cwss://my-knox-server/gateway/default/echows
已连接(按CTRL+C退出)
>你好,诺克斯!
<你好,诺克斯!
但我希望Knox仅在提供正确凭据时才接受连接:

wscat --auth <username:password> -c wss://my-knox-server/gateway/default/echows
wscat--auth-cwss://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
curl-ihttps://my-knox-server/gateway/default/my_service/ping
HTTP/1.1 401未经授权
旋度-i-u':'https://my-knox-server/gateway/default/my_service/ping
HTTP/1.1200ok
我想用WebSocket实现同样的结果

[编辑]

此外,我不完全理解websocket服务的上述service.xml配置,因为它不同于我能够使用的http服务的最简单配置:

<service role="MY_APP" name="my_app" version="0.0.1">
    <routes>
        <route path="/my_app/**"/>
    </routes>
</service>

  • 为什么在websocket服务中我需要
    策略
    ,它们是什么意思
  • 为什么
    /
    有一个元素
    ,它的语义是什么?它是否对应于rewrite.xml中的
    /
    ?那里的
    request.url
    是什么意思

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

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

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

    [编辑]

    对后续问题的答复

  • 在WebSocket没有意义的情况下,它们是来自http的工件
  • 同样,与websocket相比,http上下文可以更好地解释in重写。他们所做的是,告诉Knox何时应用重写规则,即request.url、request.body、response.url、response.body等。因为这些规则基于HTTP servlet过滤器,它们不用于重写websocket数据。我认为应该有一些吉拉在那里

  • 为什么在websocket连接的情况下不能使用http servlet过滤器?它们是由http请求初始化的,对吗?一旦检测到ws协议,Knox就会使用websocket处理程序(由jetty使用)绕过servlet过滤器。谢谢@SandeepMore,我添加了一些问题,你能看一下吗?