express下socket.io使用session验证用户

  • 作者: littlejim
  • 时间: April 23, 2015
  • 分类: node.js

express下使用socket.io来传输用户间的即时消息,如何验证却是个问题,想了一下可以在传输数据中添加一个用于验证的加密字段,不过好像这样有点麻烦,另外一种在io.set('authorization',function{..})中通过handshakeData.headers.cookie获取express下的session来验证,不过socket.io 1.x已经不再使用这种方式,结果绕了很多弯路才找到正确方式,现在使用socket.request.headers.cookie,下面是用法,以此记下

导航目录

  1. 导入模块
  2. 配置express中间件
  3. socket.io获取session验证
  4. session和cookie的理解
  1. 导入相应模块
    使用express框架模块,并引入cookie解析和session存储模块:

     var express = require('express'),// 导入express框架模块//cookieParser = require('cookie-parser'),//没有使用express可以使用分离的cookie-parser模块进行解析parseCookie = express.cookieParser("secret"),//"secret"改为你的加密签名//建立一个memory store的实例storeMemory = new express.session.MemoryStore();
  1. express使用session配置:

     //中间件app.use(express.bodyParser());app.use(express.cookieParser());    //解析cookie//使用secret设置签名来加密,使用key自定义cookie键,store设置存储方式为内存存储方式app.use(express.session({secret:'secret',key:'connect_sid',store:storeMemory}));
  1. socket.io获取session验证

    socket.io 0.9.x版本中使用io.set('authorization',function{..}):

     var io = sio.listen(app);//设置sessionio.set('authorization', function(handshakeData, callback){// 解析客户端的cookie字符串handshakeData.cookie = parseCookie(handshakeData.headers.cookie)var connect_sid = handshakeData.cookie['connect_sid']; //connect_sid即我们之前自定义的cookie键字段if (connect_sid) {//通过cookie中保存的session的id获取到服务器端对应的sessionstoreMemory.get(connect_sid, function(error, session){if (error) {// if we cannot grab a session, turn down the connectioncallback(error.message, false);}else {// save the session data and accept the connectionhandshakeData.session = session;callback(null, true);}});}else {callback('nosession');}});
    

    使用io.use(function (socket,next){..})代替io.set('authorization',function{..}),socket.request.headers.cookie代替handshakeData.headers.cookie:

     io = sio.listen(app);//设置socket的session验证io.use(function (socket,next) {//parseCookie会解析socket.request.headers.cookie并赋值给执行socket.request.cookiesparseCookie(socket.request, null, function(err) {if (err) {console.log("err parse");return next(new Error("cookie err"));}// cookie中获取sessionIdvar connect_sid = socket.request.cookies['connect_sid'];if (connect_sid) {//通过cookie中保存的session的id获取到服务器端对应的sessionstoreMemory.get(connect_sid, function(error, session){if (error) {return next(new Error('Authentication error'));}else {// save the session data and accept the connectionsocket.request.session = session;next();}});}});});
    

    现在可以在socket.request.session中看到我们的session数据了:

     io.sockets.on('connection', function (socket){var session = socket.handshake.session;//sessionvar name = session.name;var password = session.password;console.log(name+' '+password);});
    

    11.29更新

    express 4.x可以直接把express-session中间件当成socket.io处理,所以可以简单像下面这样,就可以共享express的session了

     sio.use(function(socket, next) {sessionMiddleware(socket.request, socket.request.res, next);});
    

    example:

     var Server = require("http").Server;var session = require("express-session");var app = express();var server = Server(app);var sio = require("socket.io")(server);var sessionMiddleware = session({secret: "keyboard cat",resave: false,saveUninitialized: true});sio.use(function(socket, next) {sessionMiddleware(socket.request, socket.request.res, next);});app.use(sessionMiddleware);app.get("/", function(req, res){req.session.username = 'jim';});sio.sockets.on("connection", function(socket) {console.log(socket.request.session.username); // 'jim'});server.listen(80);
  1. 区别session和cookie

    看了这么多,也对session和cookie的概念有些深入了解了。session保存在服务器,而cookie保存在浏览器上,当你浏览网页时,服务器会请求浏览器通过设置cookie来保存一些数据,cookie的内容主要包括:名字,值,过期时间,路径和域,其中如果过期时间不设置就表示浏览器关闭即删除该cookie。

    而服务器程序创建session时,会检查浏览器cookie中是否保存有session id的字段,此字段映射到服务器一个对应的session存储区,服务器通过session id找到对应的session来保存数据,而当浏览器中没有session id的时候,服务器端会创建一个新的session并生成一个session id保存在浏览器cookie中。

    所以session解决了cookie的一些不安全问题,但是同时session保存在服务器上会占用一些服务器性能,因此一些私密数据应当使用session保存,而其他信息保存为cookie。

    另外还有一个之前有些困惑的地方现在也明白些了:express中使用cookieParser对session id进行签名加密,而parseCookie对应就是对cookie进行解签。附上一段cookie-parser模块中处理cookie的代码:

     exports.signedCookies = function(obj, secret){var cookies = Object.keys(obj); var dec; var key;var ret = Object.create(null);var val;for (var i = 0; i < cookies.length; i++) {key = cookies[i]; val = obj[key];   dec = exports.signedCookie(val, secret); if (val !== dec) { ret[key] = dec;delete obj[key];}}return ret;};exports.signedCookie = function(str, secret){ return str.substr(0, 2) === 's:'? signature.unsign(str.slice(2), secret): str;};
    

Demo下载:Session-Demo.zip

标签: nodejs, session, cookie, socket.io, express

express+socket.io 共享session相关推荐

  1. TWaver HTML5 + Node.js + express + socket.io + redis(六)

    接上一篇TWaver HTML5 + Node.js + express + socket.io + redis(五), 这一篇将讲解如何用模版生成html页面, 如何验证用户登录, 您将了解到: 1 ...

  2. Express+Socket.IO 实现简易聊天室

    代码地址如下: http://www.demodashi.com/demo/12477.html 闲暇之余研究了一下 Socket.io,搭建了一个简易版的聊天室,如有不对之处还望指正,先上效果图: ...

  3. TWaver HTML5 + Node.js + express + socket.io + redis(五)

    接上一回TWaver HTML5 + Node.js + express + socket.io + redis(四), 这一篇您将了解到 1. 如何保存更改后的拓扑数据 (包括新增的, 修改的, 删 ...

  4. 14级团队学习成果汇报 -- 利用express+socket.io搭建简易版聊天室

    周鹏,14级数理系,信息与计算科学大三学生.在LSGO软件技术团队负责前端部分,本图文是他的一个完整作品,代码可在Github上下载.

  5. node express+socket.io实现聊天室

    参照网址:https://www.jb51.net/article/135058.htm https://www.cnblogs.com/limitcode/p/7845168.html https: ...

  6. vue+express+socket.io 实现qq聊天群。。。。

    先上个图.... 晚点有空写个 安装使用... github 地址 代码

  7. phaser.min.js_如何使用Phaser 3,Express和Socket.IO构建多人纸牌游戏

    phaser.min.js I'm a tabletop game developer, and am continually looking for ways to digitize game ex ...

  8. 如何使用Vue,Phaser,Node,Express和Socket.IO构建多人桌面游戏模拟器

    Putting together all of the pieces of a full stack JavaScript application can be a complex endeavor. ...

  9. Express--socket.io使用session验证

    2019独角兽企业重金招聘Python工程师标准>>> 安装依赖 npm i --save express-session socket.io 设置一下 const io = req ...

最新文章

  1. 点名系统在c++中怎么做_栅格系统是怎么做设计的
  2. boost::fusion::traits::is_sequence用法的测试
  3. Struts2.x中获取request,response,session的方式
  4. 计算机电子的危害,电子垃圾焚烧炉的危害有多大,你了解过吗?
  5. kafka java客户端消息的分区与缓存发送
  6. 三星Samsung笔记本电脑开机进入BIOS的方法与BIOS设置全功能菜单(F2)
  7. 通过VirtualBox与Vagrant在windows上搭建LNMP开发环境
  8. Sourse Insight使用过程中的常使用功能简介
  9. native数据类型 react_React-Native 之 数据持久化
  10. Unity工程发布到HoloLens
  11. opj线性表Placing apples 题解
  12. 是的,你的AI技能正在“贬值”
  13. 全栈开发-IDE介绍与设置、字符串格式化、数据类型、for循环
  14. 鸿蒙系统自带app分身,哪些手机自带应用分身功能 自带应用分身功能手机推荐...
  15. 企业实施单元测试现状调查(浙江大学管理学院 李云)
  16. P2495 [SDOI2011]消耗战-虚树+树形dp
  17. 能源结构优化与低碳化发展:低碳化指数-全国分地区能源消费结构
  18. 五分钟学GIS | 多进程切图
  19. Colab使用经验总结(踩坑经验)------小白注意!
  20. 常用SQL server 语句笔记

热门文章

  1. python用pandas读取excel指定列_Python用Pandas读写Excel
  2. Hie with the Pie(Floyd 状压DP)
  3. MySQL报错端口3306解决方法
  4. 电阻电路的等效变化(Ⅱ)
  5. ChatGPT所有插件详细教程
  6. 信息安全密码学实验二:序列密码的设计与实现
  7. 在字节跳动干软件测试5年,2月无情被辞,想给划水的兄弟提个醒
  8. 如何将markdown文件转成word
  9. android滑屏效果,Android使用ViewFlipper和GestrueDetector共同实现滑屏效果实例
  10. android 游戏遥感,Android2.2+游戏摇杆 MOPS魅影T800评测