我的Angular 2应用程序(用typescript编码)有一个简单的身份验证方案:
- 用户登录:
- 服务器返回JSON Web令牌(JWT)
abc123...
- 在每次API调用中,应用程序都会在
Authorization
报头中发送JWT - 服务器验证JWT并授予访问权限
现在我想添加WebSocket.我想知道如何验证那里的用户.因为我无法控制哪些头被发送到websocket服务器(WS),所以我无法发送JWT.
到目前为止,我的 idea (尚未实施):
- 客户端打开websocket:
let sock = new WebSocket('wss://example.com/channel/');
- WS-server在不进行任何身份验证判断的情况下接受握手.标准HTTP头在这个阶段可用.
- Client listens to the
open
event on the socket. Once the socket is open:- 客户端发送带有
type='auth'
payload='JWT_VALUE'
的消息
- 客户端发送带有
- WS-server希望套接字上的第一条消息的类型为
auth
.一旦收到,服务器就会读取有效负载,验证JWT_VALUE
并设置isAuthenticated
标志
2个问题:服务器资源可能会被连接但从未发送JWT的客户机占用,如果客户机未经过身份验证,更干净的解决方案会阻止握手.
其他 idea :
- 客户端可以通过以下路径发送JWT:
new WebSocket('wss://example.com/channel/<JWT>/')
- 服务器可以读取客户端的IP+用户代理,并与HTTP服务器在发布JWT时创建的DB记录进行匹配.然后服务器将猜测谁正在连接
如何在WebSocket上验证客户端?假设用户已经通过HTTP登录,Angular 2应用程序具有JWT令牌.