当前位置: 首页 > 知识库问答 >
问题:

Vertx SockJs Eventbus认证

邬朗
2023-03-14

我想做一只袜子。前端到vertx后端的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文档指出这是不受支持的。显然,现在正在发送新的EventBus(“http://localhost:9090/eventbus“,数据)也不起作用。

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);

无论我尝试了什么,头字段Authroation始终为空。

验证sock的标准方法是什么。js连接并注册到vertx中的eventbus请求?

共有3个答案

袁增
2023-03-14

我认为保护网络插座的最好方法是使用CORS检查

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

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

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

允许指定地址的事件进入/离开事件总线网桥

 BridgeOptions opts = new BridgeOptions()
          .addInboundPermitted(new PermittedOptions().setAddressRegex(Constants.INBOUND_REGEXP));
卢枫涟
2023-03-14

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

然而,在某些情况下,可能不希望以纯文本形式将主登录令牌作为查询参数发送,因为它比使用标头更不透明,最终将被记录在whowknowswhere。如果这引起了您的安全问题,另一种选择是仅对web套接字内容使用辅助JWT令牌。

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

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

苗森
2023-03-14

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

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

>

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

下面是如何在服务器上获取它:

String token = ctx.request().getParam("token");

连接到服务器后发送授权消息。它可以是一些JSON对象,其中包含标记字段。

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

 类似资料:
  • 我无法找到一种REST webservice方式来身份验证(登录)并知道他的角色(授权)。虽然,Openbravo维基说有一种登录的方法,但没有提供任何其他关于其网址等细节。有人能在这方面提供帮助吗?谢啦 编辑 我也在Openbravo论坛上发布了这个问题。希望这将有利于其他人。

  • 和 Web 应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sessions 或 cookies 维护, 常用的做法是每个请求都发送一个秘密的 access token 来认证用户, 由于 access token 可以唯一识别和认证用户, API 请求应通过 HTTPS

  • 认证是鉴定用户身份的过程。它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份。认证是登录功能的基础。 Yii提供了一个认证框架,它连接了不同的组件以支持登录。欲使用这个框架, 你主要需要做以下工作: 设置用户组件 user ; 创建一个类实现 yii\web\IdentityInterface 接口。 配置 yii\web\User 用户组件 u

  • 简介 Lumen 虽然与 Laravel 使用了相同的底层类库实现,但是因 Lumen 面向的是无状态 API 的开发,不支持 session,所以默认的配置不同。Lumen 必须使用无状态的机制来实现,如 API 令牌(Token)。 开始 认证服务提供者 注意: 在使用 Lumen 的认证功能前,请取消 bootstrap/app.php 文件中的 AuthServiceProvider 调用

  • 认证 通过CVS的pserver,你需要在读写操作之前“登陆”到服务器—即使是匿名操作。Subversion版本库使用Apache的httpd或svnserve作为服务器,你不需要开始时提供认证凭证—如果一个操作需要认证,服务器会要求你的凭证(不管这凭证是用户名与密码,客户证书还是两个都有)。所以如果你的工作拷贝是全局可读的,在所有的读操作中不需要任何认证。 相对于CVS,Subversion会一

  • 单独使用PAP可能会带来安全风险,但通过TLS进行隧道传输时非常安全。 这些用户可能正在使用CHAP进行身份验证。 CHAP要求密码以明文形式存储。 大多数RAS服务器允许您选择它支持的身份验证协议。 将RAS服务器配置为仅使用PAP。 您可以使用smbencrypt程序加密密码,并使用NT哈希值的NT-Password AVP。

  • 需要认证的 Swift API 请求必须在请求头里带上 X-Storage-Token 认证令牌。此令牌可以从 RADOS 网关、或别的认证器获取,要从 RADOS 网 关获取的话需创建用户,例如: sudo radosgw-admin user create --uid="{username}" --display-name="{Display Name}" For details on RAD

  • web客户端可以使用以下机制之一向web服务器认证用户身份: HTTP Basic Authentication(HTTP基本认证) HTTP Digest Authentication(HTTP摘要认证) HTTPS Client Authentication(HTTPS客户端认证) Form Based Authentication(基于表单的认证) HTTP Basic Authentica