当前位置:首页 > 短网址资讯 > 正文内容

WebSocket 的鉴权授权方案

www.ft12.com7年前 (2017-08-05)短网址资讯2765

引子

WebSocket 是个好东西,为我们提供了便捷且实时的通讯能力。然而,对于 WebSocket 客户端的鉴权,协议的 RFC 是这么说的:

This protocol doesn’t prescribe any particular way that servers can
authenticate clients during the WebSocket handshake. The WebSocket
server can use any client authentication mechanism available to a
generic HTTP server, such as cookies, HTTP authentication, or TLS
authentication.

也就是说,鉴权这个事,得自己动手

协议原理

WebSocket 是独立的、创建在 TCP 上的协议。

为了创建Websocket连接,需要通过浏览器发出请求,之后服务器进行回应,这个过程通常称为“握手”。

实现步骤:

1. 发起请求的浏览器端,发出协商报文:

2. 服务器端响应101状态码(即切换到socket通讯方式),其报文:

3. 协议切换完成,双方使用Socket通讯

直观的协商及通讯过程:

websocket-lifecycle

方案

通过对协议实现的解读可知:在 HTTP 切换到 Socket 之前,没有什么好的机会进行鉴权,因为在这个时间节点,报文(或者说请求的Headers)必须遵守协议规范。但这不妨碍我们在协议切换完成后,进行鉴权授权:

鉴权

  1. 在连接建立时,检查连接的HTTP请求头信息(比如cookies中关于用户的身份信息)

  2. 在每次接收到消息时,检查连接是否已授权过,及授权是否过期

  3. 以上两点,只要答案为否,则服务端主动关闭socket连接

授权

服务端在连接建立时,颁发一个ticket给peer端,这个ticket可以包含但不限于:

  • peer端的uniqueId(可以是ip,userid,deviceid…任一种具备唯一性的键)

  • 过期时间的timestamp

  • token:由以上信息生成的哈希值,最好能加盐

安全性的补充说明

有朋友问:这一套机制如何防范重放攻击,私以为可以从以下几点出发:

  • 可以用这里提到的expires,保证过期,如果你愿意,甚至可以每次下发消息时都发送一个新的Ticket,只要上传消息对不上这个Ticket,就断开,这样非Original Peer是没法重放的

  • 可以结合redis,实现 ratelimit,防止高频刷接口,这个可以参考 express-rate-limit,原理很简单,不展开

  • 为防止中间人,最好使用wss(TLS)

代码实现

WebSocket连接处理,基于 node.js 的 ws 实现:

授权用到的 Ticket(这里存储用到的是knex + postgreSQL):

utils 的哈希方法:

扫描二维码推送至手机访问。

版权声明:本文由短链接发布,如需转载请注明出处。

本文链接:https://www.ft12.com/article_382.html

标签: WebSocket鉴权
分享给朋友:

相关文章

从产品、市场、投资等,深入了解与分析共享充电宝

从产品、市场、投资等,深入了解与分析共享充电宝

从4月开始,继共享单车之后,共享充电宝突然为科技创投圈所青睐。共享充电宝前景如何?本文作者从产品、市场、投资等多个维度对此进行了分析,共享充电宝的未来似乎并不那么扑朔迷离。忽如一夜春风来,千树万树梨花开。今年春天,共享充电宝火了。3月31日...

支付宝征战香港 海外版App支付宝HK即将来了

支付宝征战香港 海外版App支付宝HK即将来了

5月24日,支付宝宣告推出香港版电子钱包——支付宝HK,正式为香港居民供给无现金效劳。从前,香港人只能用支付宝在taobao买买买,不能像内地用户相同,走到哪儿都掏出手机,扫码付钱,但有了这个支付宝HK这个独立App以后,香港用户也将能用支...

短链接网站站长教您如何识别短链接的安全性

短链接网站站长教您如何识别短链接的安全性

        随着微博的盛行,短链接也慢慢被广阔网民们所熟识。但是,短链接是经过什么原理完成的呢?在短链接带来便利的同时又能否会带来隐患呢?为此,ft12平安专家提示用...

实战Guzzle抓取

虽然早就知道很多人用 Guzzle 爬数据,但是我却从来没有真正实践过,因为在我的潜意识里,抓取是 Python 的地盘。不过前段时间,当我抓汽车之家数据的时候,好心人跟我提起 Goutte 搭配 G...

FT12短网址:聊一聊前端自动化测试(上)

FT12短网址:聊一聊前端自动化测试(上)

前言前天本来是想看看了解入门下前端单元测试的,当看完三个Demo之后突然想前端写单元测试主要都测什么内容。好奇之!今日早读文章由天猫@LingyuCoder分享。正文从这开始~为何要测试以前不喜欢写测试,主要是觉得编写和维护测试用例非常的浪...

【FT12短网址】借助JavaScript实现几种常见的排序算法

【FT12短网址】借助JavaScript实现几种常见的排序算法

引言排序算法有千千万万种,实现的代码也有很多,比如php, html5, JS等等。但是我们常见的排序算法也就几种而已,比如按大小升序或者降序;比如按字母先后顺序排序;比如按字符长度排序等等。排序算法是所有算法中最基础的基础。虽然关键在于算...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法和观点。