我的角2个应用程序(编码的打字稿)有一个简单的身份验证方案:在的WebSocket,角2和JSON网络令牌认证
- 用户登录:
- 服务器返回JSON网络令牌(JWT)
abc123...
- 在每个API调用,应用程序发送的智威汤逊在
Authorization
头 - Server验证的智威汤逊和赠款访问
现在我想添加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我已经做出了决定,不包括智威汤逊在url
- 服务器可以读取客户端的IP +用户代理和对阵这是由HTTP服务器创建的JWT发出时,数据库记录。然后服务器会猜测谁是连接
- 亲:握手(不知道IP)
- 骗子在这个信息可能是可用的:它似乎可怕的不安全为“猜测”一个客户端应关联一个JWT,当时客户从来没有把它展示出来。例如,假冒受害者的UA并使用相同网络(代理服务器,公共WiFi,大学内联网......)的人将能够冒充受害者。
请问你的WebSockets验证客户端?假设用户已经通过HTTP登录,并且Angular 2应用程序有一个JWT令牌。
我实际上实现了你的第一个想法 - 在握手后的第一条消息中发送JWT令牌。这不是一个非常干净的解决方案,但它的工作原理。 – Rem