首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Vertx SockJs Eventbus认证

Vertx SockJs Eventbus认证
EN

Stack Overflow用户
提问于 2017-06-06 09:59:45
回答 3查看 2.3K关注 0票数 2

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

我最初的尝试是这样的:

代码语言:javascript
复制
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创建的auth数据,尽管官方的sock.js文档声明这是不支持的。显然,现在发送new EventBus("http://localhost:9090/eventbus", data)也不起作用。

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

我的后端处理程序:

代码语言:javascript
复制
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);

无论我尝试了什么,标头字段Authroization总是为空。

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-06 21:57:44

默认情况下,SockJS使用WebSockets。不能使用JavaScript WebSocket API添加自定义标头(授权等)。请阅读此thread以获得更多解释。

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

  1. 只需将token参数添加到URL: 设eb =新的EventBus("http://localhost:8080/eventbus?token=“+令牌); 下面是如何在服务器上获得它的方法: 字符串令牌= ctx.request().getParam(" token ");
  2. 连接到服务器后发送授权消息。它可以是一些包含token字段的JSON对象。

我认为,第一个选项已经足够了,但是第二个选项在事件总线和SockJS方面可能更难实现。

票数 7
EN

Stack Overflow用户

发布于 2018-10-10 22:28:13

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

但是,在某些情况下,以纯文本形式发送主登录令牌作为查询参数可能是不可取的,因为它比使用标头更不透明,最终会被记录在何处。如果这给您带来了安全问题,的另一种选择是只为web 使用一个次要的JWT令牌。

创建一个REST端点来生成这个JWT,当然只有通过主登录令牌进行身份验证的用户才能访问这个端点(通过标头传输)。web可以配置与登录令牌不同的配置,例如,使用更短的超时时间,因此作为升级请求的查询param发送更安全。

为您在上注册SockJS eventbusHandler的同一条路由创建一个单独的eventbusHandler。确保首先注册了auth处理程序,这样就可以对照数据库检查web套接字令牌( JWT应该以某种方式链接到后端的用户)。

票数 1
EN

Stack Overflow用户

发布于 2017-06-10 19:17:50

我认为保护web套接字的最好方法是使用CORS检查。

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

代码语言:javascript
复制
router.route().handler(CorsHandler.create(your host origin path).allowCredentials(true));

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

允许事件总线桥内/外指定地址的事件

代码语言:javascript
复制
 BridgeOptions opts = new BridgeOptions()
          .addInboundPermitted(new PermittedOptions().setAddressRegex(Constants.INBOUND_REGEXP));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44386942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档