加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-17 10:17:29 所属栏目:安全 来源:网络整理
导读:我的Angular 2应用程序(用typescript编码)有一个简单的身份验证方案: 用户登录: 服务器返回JSON Web令牌(JWT)abc123 … 在每次API调用时,应用程序都会在Authorization标头中发送JWT 服务器验证JWT并授予访问权限 现在我想添加websockets.我想知道如何在那
我的Angular 2应用程序(用typescript编码)有一个简单的身份验证方案:

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

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

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

>客户端打开websocket:让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/u0026lt; JWT> /’)

> pro:在握手期间可以获得此信息
> con:这条路似乎不是JWT的“合适”地方.特别是因为中间代理和访问日志将保存路径;在设计HTTP API时,我已经决定不在网址中包含JWT

>服务器可以读取客户端的IP UserAgent,并与发出JWT时HTTP服务器创建的DB记录进行匹配.然后,服务器将猜测谁正在连接

>亲:握手期间可以获得此信息(不确定IP)
> con:当客户端从未提供JWT时,“猜测”客户端应该与JWT相关联,这似乎非常不安全.例如,欺骗受害者的UA并使用相同网络(代理,公共wifi,大学内联网……)的人将能够冒充受害者.

如何在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){/*...*/}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读