当前位置: 首页 > 面试题库 >

建立套接字后进行socket.io身份验证

刘曾琪
2023-03-14
问题内容

我正在研究一款小型多人游戏。我想介绍身份验证。我正在使用Node.js和Socket.io。

当用户到达该主页时-无论他们是否登录,我都希望他们加入游戏-但他们将无法在其中进行任何操作(仅观看)。

然后我该如何在已经打开的套接字上对用户进行身份验证?

如果他们离开站点并回来,我还能保持身份验证吗?您可以通过网络套接字传递Cookie吗?

编辑

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

client.on('onLogin', loginfunction);

然后,我可以使用用户名和密码,对照数据库进行检查,然后获取套接字的会话ID,并将其传递到某个地方,以表明该会话已通过该用户的身份验证。

这样安全吗?我还能在套接字上实现cookie以便它们回来吗?socket.io中是否有任何方法说明套接字现在已通过身份验证,而不是手动检查收到的每条消息?

干杯


问题答案:

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

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

  2. 是的: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
    });

});


 类似资料:
  • 问题内容: 我正在尝试在Node.js中使用Socket.IO,并试图允许服务器为每个Socket.IO客户端赋予一个身份。由于套接字代码不在http服务器代码的范围内,因此无法轻松访问已发送的请求信息,因此我假设在连接期间需要将其发送出去。什么是最好的方法 1)将有关谁通过Socket.IO连接到服务器的信息 2)验证他们说的是谁(如果正在使事情变得更容易,我目前正在使用Express) 问题答

  • 我将尝试对 socket.io 上的连接进行身份验证。 目前,用户首先通过REST API进行身份验证,然后,我向用户发送一个,其中包含经过身份验证的用户的用户名。打开客户端和服务器之间的连接后,我的计划是从连接的套接字列表中临时删除该套接字,以防止在执行身份验证时在服务器之间接收和发送数据。 在这个身份验证中,我验证令牌,如果令牌有效,我将套接字的id重新添加到已连接套接字的列表中。唯一的问题是

  • 我收到一个错误“无法建立SSL连接,请参阅内部异常。身份验证失败,请参阅内部异常。”当尝试通过C#HttpWebRequest通过SSL发布请求时(已尝试RestSharp和HttpClient,结果相同)。我还尝试了网络上提到的所有可能的解决方案,如: 他们都不为我工作。另一个问题是,我在另一台计算机上运行相同的项目,它的工作没有任何问题。所以看起来问题的来源是环境,也许. net框架或注册表中

  • 我想知道socket.io身份验证的最佳实践是什么。 Alice发出事件'message',参数包括Bobs、唯一标识符等。Bob在监听Socket.on('message')事件时接收消息。

  • 我正在尝试使用urllib3连接到网页。代码如下所示。 如果我们假设url是需要使用用户名和密码进行身份验证的某个网页,那么我是否使用正确的代码进行身份验证? 我使用urllib2做这件事很舒服,但使用urllib3做不到同样的事情。 非常感谢

  • jwt不应该仅仅用于认证用户吗?我读到过可以在里面存储非敏感的东西,比如用户ID。将权限级别之类的东西存储在令牌中可以吗?这样我可以避免数据库调用。