小编典典

这实际上并不难,但是您正以错误的方式进行处理。几件事:

您不能使用socket.io 设置 cookie;但是,您可以随时获取任何已连接客户端的cookie值。为了设置cookie,您将必须发送一个新的http响应,这意味着用户必须先发送一个新的http请求(又名刷新或转到新页面,这听起来对您而言不可能)。

是的:socket.io是安全的(只要可以传输任何数据即可)。

因此,您可以执行以下操作:

在用户的初始连接上,创建具有唯一会话ID的cookie,例如从Express的会话中间件生成的cookie。但是,您将需要配置它们,使其在会话结束时不过期(否则,它们将在关闭浏览器后立即过期)。

接下来,您应该创建一个对象来存储cookie会话ID。每次设置新的connect.sid

cookie时,都将其默认值存储在新对象中(这意味着该用户已通过会话而非登录进行了身份验证)

在用户的登录名上,向服务器发送套接字发出消息,然后您可以在其中验证登录凭据,然后更新您创建的会话ID对象,以使当前套接字ID读为true(登录)。

现在,当接收到新的http请求时,读取cookie.sid,并检查其在对象中的值是否为true。

它看起来应该如下所示:

var express = require('express'),

http = require('http'),

cookie = require('cookie');

var app = express();

var server = http.createServer(app);

var io = require('socket.io').listen(server);

app.use(express.cookieParser());

app.use(express.session({

secret: 'secret_pw',

store: sessionStore,

cookie: {

secure: true,

expires: new Date(Date.now() + 60 * 1000), //setting cookie to not expire on session end

maxAge: 60 * 1000,

key: 'connect.sid'

}

}));

var sessionobj = {}; //This is important; it will contain your connect.sid IDs.

//io.set('authorization'...etc. here to authorize socket connection and ensure legitimacy

app.get("/*", function(req, res, next){

if(sessionobj[req.cookies['connect.sid']]){

if(sessionobj[req.cookies['connect.sid']].login == true){

//Authenticated AND Logged in

}

else{

//authenticated but not logged in

}

}

else{

//not authenticated

}

});

io.sockets.on('connection', function(socket){

sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].login = false;

sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid'].socketid = socket.id;

socket.on('login', function(data){

//DB Call, where you authenticate login

//on callback (if login is successful):

sessionobj[cookie.parse(socket.handshake.headers.cookie)['connect.sid']] = true;

});

socket.on('disconnect', function(data){

//any cleanup actions you may want

});

});

2020-07-07

c语言socket鉴权,建立套接字后进行socket.io身份验证相关推荐

  1. Socket通信流程和套接字作用

    [1]Socket的功能 (1)Socket的英文原意就是"孔"或"插座",现在,作为BSD UNIX的进程通讯机制,取其后一种意义.日常生活中常见的插座,有的 ...

  2. 【网络篇】第五篇——网络套接字编程(一)(socket详解)

    socket编程 套接字概念 数据传输方式 ip地址转换函数 socket常见API sockaddr数据结构 socket缓冲区以及阻塞模式 LINUX下socket程序的演示 socket编程 套 ...

  3. 糖儿飞教你学C++ Socket网络编程——5.套接字编程步骤与函数

    TCP是一个面向连接的传输层协议,提供高可靠性的字节流传输服务,主要用于一次传输要交换大量报文的情形.为了维护传输的可靠性,TCP增加了许多开销:例如确认.流量控制.计时器以及连接管理等.TCP协议的 ...

  4. Linux小知识--原始套接字(raw socket)之模拟ping

    原始套接字-raw socket 最近在研究高并发下扫描存活主机,基本想法是通过socket来模拟ICMP报文,然后就发现了socket的一片新天地----原始套接字(raw socket). raw ...

  5. 网络套接字(Network socket)

    网络套接字(英语:Network socket:又译网络套接字.网络接口.网络插槽)在计算机科学中是电脑网络中进程间资料流的端点.使用以网际协议(Internet Protocol)为通信基础的网络套 ...

  6. af_packet_C语言中利用AF_PACKET 原始套接字发送一个任意以太网帧 (一)

    目标 利用AF_PACKET 套接字发送一个任意的以太网帧 背景 以太网是一个链路层协议.大多数网络程序员关注网络栈的传输层及以上,所以不需要直接处理以太网帧,但是某些场景下关注传输层以下也是有必要的 ...

  7. socket是什么?套接字是什么?

    网络编程就是编写程序使两台联网的计算机相互交换数据. 那么,这两台计算机之间用什么传输数据呢?首先你肯定先需要物理连接嘛. 在此基础上,只需要考虑如何编写数据传输程序.看似很麻烦,但实际上这点不用愁, ...

  8. 传奇世界服务器端口被占用,Windows socket error: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次。 (10048), on API 'bi...

    Windows socket error: 通常每个套接字地址(协议/网络地址/端口)只允许使用一次. (10048), on API 'bind' 你们的系统80%都是XP的,这个就是XP系统的不适 ...

  9. 基于原始套接字(raw socket)的网络抓包工具

    基于raw socket的网络抓包工具 1. 原始套接字(raw socket)简介 原始套接字可以接收本机网卡上的数据帧或者数据包,利用raw socket可以编写基于IP协议的程序.一般的TCP/ ...

最新文章

  1. 浏览器上实现数据的本地存储・小结
  2. php中的extract函数
  3. php数字小数大小比较,PHP 常用的数学函数和数值处理函数
  4. 解决“安装VMM过程中无法注册SPN以及SCP”问题一例
  5. 这个需求的目的是什么?
  6. Windows Azure Cloud Service (17) Role Endpoint
  7. Android数据库 分页查询,Android之怎么使用SQLite数据库(增、删、改、查、分页等)以及ListView显示数据(转)...
  8. 多分支维护难题:如何提交 ChangeLog 变更日志?
  9. paip。java 高级特性 类默认方法,匿名方法+多方法连续调用, 常量类型
  10. 机械工程专业英语复习
  11. SLA文档提高期学习总结
  12. 基于C语言 51单片机应用技术 速成教程(持续更新中)
  13. python多元非线性回归模型_Python 非线性回归 - 树懒学堂
  14. 按键精灵 - 安卓版 - 罗盘 - 八向方位模拟 - 自动寻路
  15. thinkphp6-学习记录-应用手册
  16. networkx igraph相互转换+效率比较
  17. Java线程中的静态方法_Java多线程3:Thread中的静态方法
  18. 医药电商行业概况及发展趋势!
  19. Java 输出杨辉三角
  20. 点到直线(超平面)的距离公式

热门文章

  1. H3C 2126 限速后的问题
  2. Linux - 搭建FastDFS分布式文件系统
  3. http强制跳转https,POST请求变成GET
  4. 如何调试 Android 上 HTTP(S) 流量
  5. [Linux]配置网络
  6. Scala---For语句段
  7. 快速获取本机IP地址AWK功能
  8. CAS SSO实践中,目前解决的问题和有待解决的问题
  9. Vista操作系统评估参考资料
  10. webform 控件上面能写 前端事件吗_详细的网易前端秘籍—如何准备面试