Websocket,Angular 2和JSON Web令牌身份验证
我的Angular 2应用程序(用typescript编码)有一个简单的身份验证方案:
>用户登录: 现在我想添加websockets.我想知道如何在那里验证用户.由于我不控制哪些头发送到websocket服务器(WS),我无法发送JWT. 到目前为止我的想法(尚未实施): >客户端打开websocket:让sock = new WebSocket(‘wss://example.com/channel/’); >客户端发送type =’auth’payload =’JWT_VALUE’的消息 > WS服务器期望套接字上的第一条消息是auth类型.收到后,服务器读取有效负载,验证JWT_VALUE并设置isAuthenticated标志 >如果验证失败,服务器将断开套接字 2个问题:服务器资源可以由连接但从不发送JWT的客户端占用,如果客户端未经过身份验证,则更干净的解决方案会阻止握手. 其他想法: >客户端可以在路径中发送JWT:new WebSocket(‘wss://example.com/channel/u0026lt; JWT> /’) > pro:在握手期间可以获得此信息 >服务器可以读取客户端的IP UserAgent,并与发出JWT时HTTP服务器创建的DB记录进行匹配.然后,服务器将猜测谁正在连接 >亲:握手期间可以获得此信息(不确定IP) 如何在websockets上验证客户端?假设用户已经通过HTTP登录并且Angular 2应用程序具有JWT令牌.
我决定采用以下协议:
1.客户端登录站点并接收和身份验证令牌(JSON Web令牌) GET /auth { user: 'maggie',pwd: 'secret' } // response { token: '4ad42f...' } 2.经过身份验证的客户端请求websocket连接票证 GET /ws_ticket Authorization: Bearer 4ad42f... // response: single-use ticket (will only pass validation once) { ticket: 'd76a55...',expires: 1475406042 } 3.客户端打开websocket,在查询参数中发送票证 var socket = new WebSocket('wss://example.com/channel/?ticket=d76a55...'); 4. Websocket服务器(PHP)然后在接受握手之前验证票证 /** * Receives the URL used to connect to websocket. Return true to admit user,* false to reject the connection */ function acceptConnection($url){ $params = parse_str(parse_url($url,PHP_URL_QUERY)); return validateTicket($params['ticket']); } /** Returns true if ticket is valid,never-used,and not expired. */ function validateTicket($ticket){/*...*/} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |