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 种方式,您可以如何添加授权:
只需在URL中添加token
参数即可:
let eb = new EventBus("http://localhost:8080/eventbus?token=" + token);
以下是在服务器上获取它的方法:
String token = ctx.request().getParam("token");
连接到服务器后发送授权消息。可以是一些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 应该以某种方式链接到后端的用户)。
我正在尝试建立从前端到 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 种方式,您可以如何添加授权:
只需在URL中添加
token
参数即可:let eb = new EventBus("http://localhost:8080/eventbus?token=" + token);
以下是在服务器上获取它的方法:
String token = ctx.request().getParam("token");
连接到服务器后发送授权消息。可以是一些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 应该以某种方式链接到后端的用户)。