Bee*_*ice 11 authentication websocket jwt typescript angular
我的Angular 2应用程序(用typescript编码)有一个简单的身份验证方案:
abc123...Authorization标头中发送JWT现在我想添加websockets.我想知道如何在那里验证用户.由于我不控制哪些头发送到websocket服务器(WS),我无法发送JWT.
到目前为止我的想法(尚未实施):
let sock = new WebSocket('wss://example.com/channel/');open套接字上的事件.套接字打开后:
type='auth' payload='JWT_VALUE'auth.收到后,服务器读取有效负载,验证JWT_VALUE并设置isAuthenticated标志
isAuthenticated发送任何其他类型的消息,服务器将断开套接字2个问题:服务器资源可以由连接但从不发送JWT的客户端占用,如果客户端未经过身份验证,则更干净的解决方案会阻止握手.
其他想法:
new WebSocket('wss://example.com/channel/<JWT>/')
如何在websockets上验证客户端?假设用户已经通过HTTP登录并且Angular 2应用程序具有JWT令牌.
Bee*_*ice 12
我决定采用以下协议:
1.客户端登录站点并接收和身份验证令牌(JSON Web令牌)
GET /auth
{
user: 'maggie',
pwd: 'secret'
}
// response
{ token: '4ad42f...' }
Run Code Online (Sandbox Code Playgroud)
2.经过身份验证的客户端请求websocket连接票证
GET /ws_ticket
Authorization: Bearer 4ad42f...
// response: single-use ticket (will only pass validation once)
{ ticket: 'd76a55...', expires: 1475406042 }
Run Code Online (Sandbox Code Playgroud)
3.客户端打开websocket,在查询参数中发送票证
var socket = new WebSocket('wss://example.com/channel/?ticket=d76a55...');
Run Code Online (Sandbox Code Playgroud)
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){/*...*/}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7030 次 |
| 最近记录: |