基于Token认证的WebSocket连接

概要

WebSocket作为一种支持浏览器与服务器全双工通信的协议,对于复杂的前端应用,在交互体验和性能的改进上,是一种非常合适的解决方案。随着WebSocket更多地应用于生产开发,安全也成为了必须要关注的问题。

关于安全有一个可能的误区是:如果用户通过了web应用的认证(登录了系统),建立的WebSocket连接,就也是经过认证的。实际上,这是两个完全不同的通道,socket连接需要建立自己的认证体系。

认证的方式(cookie or Token)

有两种方式可以解决认证的问题,一种是传统的基于cookie,一种是基于Token的。

两种方式比较起来,个人更倾向于基于Token的方案。主要是以下几方面考虑:

  • 耦合性。基于cookie,意味着,应用本身的认证和提供WebSocket的服务,得是同一套session cookie的管理机制。有的时候,可能这也不是大的问题,但是以目前我们工程中的大部分场景看,应用服务是基于java的一些web framework,而socket由Socket.IO来提供。让两个功能的系统协调一种共享的认证方式,就不那么容易。所以,需要解除这种对应用服务的依赖。
  • session的管理。同时,如果WebSocket服务自己来维护基于cookie的认证,就需要借助一些存储(DB、Redis)来存储session。作为一个纯为解决通信连接的服务,这一块也是不希望来维护的。
  • 适用性。另外,cookie也会在有些设备或浏览器设置中被禁用,在这种情况下,就还需要一种替代的方式来实现认证。这一点上,cookie也是不如基于Token的。

基于Token的认证

在Token的实现方式上,可以选择JSON Web Token(JWT)。这是一种开放的轻量级的认证规范(RFC 7519),用于保证在用户和服务器之间传递安全可靠的信息。

以下是一个简单的例子,基于express、Socket.IO来构建了一个支持认证的WebScoket通信服务。

其中,用到了两个实现库:

服务端

应用服务模块,在用户登录的时候创建一个token,

var jwt = require('jsonwebtoken');

app.post('/login', function (req, res) {

  var profile = {
    name: 'david',
    email: 'david@alibaba.com',
    id: 123
  };

  // 根据profile信息生产token
  var token = jwt.sign(profile, jwtSecret);

  res.json({token: token});
});

var server = http.createServer(app);

在Socket.IO模块,绑定一个全局的回调用来做认证。

var socketioJwt = require('socketio-jwt');

var sio = socketIo.listen(server);

sio.set('authorization', socketioJwt.authorize({
  secret: jwtSecret,
  handshake: true
}));

sio.sockets
  .on('connection', function (socket) {
     console.log('connected');
     //socket.on('event');
  });

server.listen(9000, function () {
  console.log('listening on http://localhost:9001');
});

其中,jwtSecret需要保存在服务器上,用来完成JWT的验证。

如果客户单发送了有效的JWT,相当于握手成功并且connection就会建立。

客户端

以下是一个简单的客户端例子:

function connect_socket (token) {
  var socket = io.connect('', {
    query: 'token=' + token
  });

  socket.on('connect', function () {
    console.log('authenticated');
  }).on('disconnect', function () {
    console.log('disconnected');
  });
}

$('#login').submit(function (e) {
  e.preventDefault();
  $.post('/login', {
    username: $('username').val(),
    password: $('password').val()
  }).done(function (result) {
    connect_socket(result.token);
  });
});

相比较基于cookie,基于token的方式非常易于代码实现,且便于集成到已有系统中。

时间: 2025-01-30 22:10:30

基于Token认证的WebSocket连接的相关文章

HTML5基于Tomcat 7.0实现WebSocket连接并实现简单的实时聊天_javascript技巧

1.什么是WebSocket? WebSocket 是一种自然的全双工.双向.单套接字连接.使用WebSocket,你的HTTP 请求变成打开WebSocket 连接(WebSocket 或者WebSocket over TLS(TransportLayer Security,传输层安全性,原称"SSL"))的单一请求,并且重用从客户端到服务器以及服务器到客户端的同一连接.WebSocket 减少了延迟,因为一旦建立起WebSocket 连接,服务器可以在消息可用时发送它们.例如,和轮

EMAIL发送系统(C#+基于SMTP认证) 2.0

smtp 这个是对于 EMAIL发送系统(C#+基于SMTP认证) 1.0 的改版这个第一版是2002年11月写的,过了一年半了,才有人提意见,就修正了一下,因为后来做的项目一直用不上,也就没有注意到 前段时间有网友反馈了一些问题,这次主要做了一些修正 1,text模式下发往163的邮件内容不见了2,如果用outlook接收而不是在网上看邮件的话,会发现正文内容,但其后跟着一些乱码.3,一些新开通的邮箱收到的是乱码,如*@126.com4,修正了带附件的邮件,打开附件时内容混乱的问题 感谢 Li

Android HTTPS验证和添加http头信息token认证

 实现https信任所有证书的方法 Android平台上经常有使用https的需求,对于https服务器使用的根证书是受信任的证书的话,实现https是非常简单的,直接用httpclient库就行了,与使用http几乎没有区别.但是在大多数情况下,服务器所使用的根证书是自签名的,或者签名机构不在设备的信任证书列表中,这样使用httpclient进行https连接就会失败.解决这个问题的办法有两种,一是在发起https连接之前将服务器证书加到httpclient的信任证书列表中,这个相对来说比较复

ASP.NET实现基于Forms认证的WebService应用实例

  这篇文章主要介绍了ASP.NET实现基于Forms认证的WebService应用,实例分析了使用Forms进行WebService身份认证的相关技巧与实现方法,需要的朋友可以参考下 在安全性要求不是很高的ASP.Net程序中,基于Forms的身份验证是经常使用的一种方式,而如果需要对WebService进行身份验证,最常用的可能是基于Soap 标头的自定义身份验证方式.如果对两者做一下比较的话,显然,基于Forms的验证方式更加方便易用,能否将Forms验证方式应用到WebService中去

token认证-struts2 token重复提交验证 跳转到错误页后如何返回

问题描述 struts2 token重复提交验证 跳转到错误页后如何返回 有一个用户身份认证的表单(页面A),用户输入个人信息后点击提交触发begin.action,认证通过后跳转到另外一个页面(页面B),为防止在此页面B上刷新操作在页面A中的begin.action上加入了token认证,如果出现重复提交会跳转到error.jsp的出错页面.问题:我想在error.jsp中加入一个"返回"链接 <a href="javascript:history.go(-1)&qu

服务器-求教微信token认证问题。。

问题描述 求教微信token认证问题.. 最近开始接触微信接口,服务器后台的语言是java,参照的是柳峰老师的文章http://blog.csdn.net/lyq8479/article/details/8944988 现在通过浏览器访问接口没有问题 通过后台的log查看加密与验证签名部分也没有问题 这是后台验证部分 这是这段代码的log 看上去很美,可是公众平台每次提交就是报token验证失败...快崩溃了..求救.. 解决方案 Constants.TOKEN,timestamp,nonce这

基于资源编排一键交付连接RDS的应用

本文是基于资源编排一键交付应用的进阶篇.众所周知,许多 Web 应用都会涉及对数据库的访问,但出于对数据的保护,通常我们在构建应用时会将应用本身和其对应的数据库分别部署在不同的机器上,以实现数据与应用相隔离.同时,为了降低应用构建的复杂度,阿里云提供了稳定可靠.可弹性伸缩的在线数据库服务 RDS,实现了对数据库的快速部署,从而使得对应用的部署工作主要集中在应用本身,所以本文将讲解如何基于资源编排实现应用与 RDS 的连接.基于资源编排一键交付连接 RDS 的应用的工作,主要包括以下两个方面: 熟

ASP.NET实现基于Forms认证的WebService应用实例_实用技巧

本文实例讲述了ASP.NET实现基于Forms认证的WebService应用方法.分享给大家供大家参考.具体实现方法如下: 在安全性要求不是很高的ASP.Net程序中,基于Forms的身份验证是经常使用的一种方式,而如果需要对WebService进行身份验证,最常用的可能是基于Soap 标头的自定义身份验证方式.如果对两者做一下比较的话,显然,基于Forms的验证方式更加方便易用,能否将Forms验证方式应用到WebService中去呢? 从理论上讲,使用基于Forms的方式对WebServic

android客户端基于百度地图与服务器连接失败

问题描述 android客户端基于百度地图与服务器连接失败 LocationListener的派生类class图标上一直有个红色方框 intent启动GPSReport system.out会输出Service startcommand! 不输出TestLocatioinListener里的位置时间.经纬度等. 之前logcat有报错could not find class com.baidu.platform.comapi.basestruct.Geopoint referenced from