套接字build立后的socket.ioauthentication

我正在做一个小型的多人游戏。 我想介绍身份validation。 我正在使用Node.js和Socket.io。

当用户到达那个主页时 – 我希望他们join游戏,不pipe他们是否login – 但是他们将无法做任何事情(只有监视)。

那么我怎么能在已经打开的套接字上authentication用户呢?

如果他们离开网站并返回,我还可以保持身份validation吗? 你可以通过networking套接字传递cookie吗?

编辑

进一步我的问题。 我有一个可能的想法是提供websocket连接,然后当他们尝试login时,它将用户名和密码作为消息传递给websocket。

client.on('onLogin', loginfunction); 

然后,我可以获取用户名和密码,检查数据库,然后获取套接字的会话标识并将其传递到某个地方,以便向该用户validation会话。

这是安全的吗? 我还可以在sockets上实现一个cookie,以便他们可以回来吗? socket.io中有没有什么办法说明套接字现在已经过validation,而不是手动检查每个收到的消息?

干杯

这实际上并不难,但是你正在接近错误的方向。 几件事情:

  1. 你不能用socket.io 设置一个cookie; 但是,您可以随时获取任何连接的客户端的Cookie值。 为了设置一个cookie,你将不得不发送一个新的http响应,这意味着用户必须首先发送一个新的http请求(又名刷新或进入一个新的页面,这听起来在这里是不可能的)。

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

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

在用户的初始连接上,创build一个具有唯一会话ID的cookie,例如从Express会话中间件生成的cookie。 您需要将它们configuration为不会在会话结束时过期(否则只要closures浏览器就会过期)。

接下来,您应该创build一个对象来存储Cookie会话ID。 每次设置一个新的connect.sid cookie时,将默认值为false的新对象存储(意味着用户已通过会话身份validation,但不通过login)

在用户的login名上,发送一个socket发送给服务器,在那里你可以validationlogin凭证,然后更新你创build的会话id对象,以读取当前套接字ID的真实(login)。

现在,当接收到一个新的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 }); }); 

克里斯,我不能回答,因为我不是socket.io的专家,但我可以试着指出另一个可以帮助你的方向,并且拿走一些开发时间。

但首先,一个免责声明:我为Realtime.co工作,并没有试图做任何forms的广告。 我与开发人员密切合作,只是试图通过为您的问题提供开箱即用的解决scheme来帮助您。 而且,作为一名玩家,我不能远离试图帮助人们获得他们的游戏!

Realtime使用authentication/授权层,您可以在其中为用户提供用户对频道的读/写权限。 当用户进入网站时,你可以给他们只读游戏频道的权限,一旦他们login,你可以给他们写权限。 这可以通过做一个authentication后重新连接到服务器(它可以完成客户端)很容易地完成。 不过,我会在服务器端增加安全性。

Realtime具有Node.js API,因此您可以轻松地将其与您的服务器集成。 既然它也有许多其他平台(包括移动平台)的API,并且它们都以相同的方式工作,实际上你可以让游戏在同一个通信层上的多个平台上工作,同时完全控制通道。

谢谢阅读。

编辑:

你可以在这里阅读文档以获取更多信息: http : //docs.xrtml.org/