Vertx SockJs 事件总线身份验证

Vertx SockJs Eventbus Authentication

我正在尝试建立从前端到 vertx 后端的 sock.js 连接。

我最初的尝试是这样的:

let token = '<the token>';
let data = {'Authorization' : 'Bearer ' + token};
let eb = new EventBus("http://localhost:8080/eventbus");
  eb.onopen = function () {
  eb.registerHandler('notifications', data, (err, msg) =>  {
    // handle the response
  });
}

这是行不通的,因为我需要在创建 EventBus 时发送授权数据,尽管官方 sock.js 文档指出这不受支持。显然现在发送 new EventBus("http://localhost:9090/eventbus", data) 也不起作用。

https://github.com/sockjs/sockjs-node#authorisation

我的后端处理程序:

final BridgeOptions bridgeOptions = new BridgeOptions()
  .addOutboundPermitted(new PermittedOptions().setAddress("notifications"))

final SockJSHandler sockJSHandler = SockJSHandler.create(vertx).bridge(bridgeOptions, event -> {
  event.complete(true);
});

router.route("/eventbus/*").handler(ctx -> {
  String token = ctx.request().getHeader("Authorization"); // null
});
router.route("/eventbus/*").handler(sockJSHandler);

无论我尝试什么,header 字段 Authroization 始终为空。

验证 sock.js 连接并注册到 vertx 中的事件总线请求的标准方法是什么?

SockJS 默认使用 WebSockets。您不能使用 JavaScript WebSocket API 添加自定义 headers(授权等)。阅读此 thread 以获得更多解释。

我看到了 2 种方式,您可以如何添加授权:

  1. 只需在URL中添加token参数即可:

    let eb = new EventBus("http://localhost:8080/eventbus?token=" + token);
    

    以下是在服务器上获取它的方法:

    String token = ctx.request().getParam("token");
    
  2. 连接到服务器后发送授权消息。可以是一些JSONobject,其中包含token字段。

我认为,第一个选项就足够了,但是,就事件总线和 SockJS 而言,第二个选项可能更难实现。

I think best way to secure a web-socket is using CORS check

跨源资源共享是一种允许请求资源的安全机制

router.route().handler(CorsHandler.create(your host origin path).allowCredentials(true));

我们还可以使用 sockjs 添加更多安全层:

允许事件总线桥

的指定地址in/out发生事件
 BridgeOptions opts = new BridgeOptions()
          .addInboundPermitted(new PermittedOptions().setAddressRegex(Constants.INBOUND_REGEXP));

由于无法发送授权 header,附加令牌查询参数(如@berserkk 所述)是可行的方法。

但是,在某些情况下,可能不希望以纯文本形式发送您的主登录令牌作为查询参数,因为它比使用 header 更不透明,并且最终会被谁知道的地方记录下来。如果这引起了您的安全问题,另一种方法是使用仅用于网络套接字内容的辅助 JWT 令牌

创建用于生成此 JWT 的 REST 端点,它当然只能由使用您的主登录令牌(通过 header 传输)进行身份验证的用户访问。 Web 套接字 JWT 的配置可以不同于您的登录令牌,例如超时时间更短,因此作为升级请求的查询参数发送更安全。

为在 上注册 SockJS eventbusHandler 的同一路由创建一个单独的 JwtAuthHandler。确保首先注册您的身份验证处理程序,以便您可以根据数据库检查网络套接字令牌(JWT 应该以某种方式链接到后端的用户)。