相关疑难解决方法(0)

Websockets客户端API中的HTTP标头

看起来很容易使用任何支持此功能的HTTP头客户端向您的websocket客户端添加自定义HTTP标头,但我无法找到如何使用JSON API执行此操作.

然而,似乎应该在规范中支持这些标题.

任何人都知道如何实现它?

var ws = new WebSocket("ws://example.com/service");
Run Code Online (Sandbox Code Playgroud)

具体来说,我需要能够发送HTTP授权标头.

javascript header http websocket

170
推荐指数
10
解决办法
15万
查看次数

Websocket,Angular 2和JSON Web令牌身份验证

我的Angular 2应用程序(用typescript编码)有一个简单的身份验证方案:

  • 用户登录:
  • 服务器返回JSON Web令牌(JWT) abc123...
  • 在每次API调用时,应用程序都会在Authorization标头中发送JWT
  • 服务器验证JWT并授予访问权限

现在我想添加websockets.我想知道如何在那里验证用户.由于我不控制哪些头发送到websocket服务器(WS),我无法发送JWT.

到目前为止我的想法(尚未实施):

  • 客户端打开websocket: let sock = new WebSocket('wss://example.com/channel/');
  • WS服务器接受握手而不进行任何身份验证检查 标准HTTP标头在此阶段可用.
  • 客户端侦听open套接字上的事件.套接字打开后:
    • 客户端发送消息 type='auth' payload='JWT_VALUE'
  • WS服务器期望套接字上的第一条消息是类型的auth.收到后,服务器读取有效负载,验证JWT_VALUE并设置isAuthenticated标志
    • 如果验证失败,服务器将断开套接字
    • 如果客户端没有isAuthenticated发送任何其他类型的消息,服务器将断开套接字

2个问题:服务器资源可以由连接但从不发送JWT的客户端占用,如果客户端未经过身份验证,则更干净的解决方案会阻止握手.

其他想法:

  • 客户端可以在路径中发送JWT: new WebSocket('wss://example.com/channel/<JWT>/')
    • 亲:握手期间可以获得此信息
    • con:这条路似乎不是JWT的"合适"地方.特别是因为中间代理和访问日志将保存路径; 在设计HTTP API时,我已经决定不在网址中包含JWT
  • 服务器可以读取客户端的IP + UserAgent,并与发布JWT时由HTTP服务器创建的DB记录进行匹配.然后,服务器将猜测谁正在连接
    • 亲:这个信息可能在握手期间可用(不确定IP)
    • con:当客户端从未提供JWT时," 猜测 "客户端应该与JWT相关联,这似乎非常不安全.例如,欺骗受害者的UA并使用相同网络(代理,公共wifi,大学内联网......)的人将能够冒充受害者.

如何在websockets上验证客户端?假设用户已经通过HTTP登录并且Angular 2应用程序具有JWT令牌.

authentication websocket jwt typescript angular

11
推荐指数
1
解决办法
7030
查看次数