这实际上并不难,但是您正以错误的方式进行处理。几件事:
您不能使用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 legitimacyapp.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 });});
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)