Socket.IO身份验证?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (211)

我试图在Node.js中使用Socket.IO,并试图让服务器为每个Socket.IO客户端提供一个身份。由于套接字代码超出了http服务器代码的范围,因此它无法轻松访问发送的请求信息,因此我假定它将需要在连接期间发送。什么是最好的方式

1)通过Socket.IO向服务器获取有关谁正在连接的信息

2)验证他们说他们是谁(我正在使用Express,如果这使得事情变得更容易)

提问于
用户回答回答于

使用connect-redis并将redis用作所有经过身份验证的用户的会话存储。确保在发送密钥时(通常是req.sessionID)到客户端。让客户端将此密钥存储在cookie中。

在套接字连接(或随后的任何时候)从cookie获取此密钥并将其发送回服务器。使用此密钥在redis中获取会话信息。(GET键)

例如:

服务器端(使用redis作为会话存储):

req.session.regenerate...
res.send({rediskey: req.sessionID});

客户端:

//store the key in a cookie
SetCookie('rediskey', <%= rediskey %>); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx

//then when socket is connected, fetch the rediskey from the document.cookie and send it back to server
var socket = new io.Socket();

socket.on('connect', function() {
  var rediskey = GetCookie('rediskey'); //http://msdn.microsoft.com/en-us/library/ms533693(v=vs.85).aspx
  socket.send({rediskey: rediskey});
});

服务器端:

//in io.on('connection')
io.on('connection', function(client) {
  client.on('message', function(message) {

    if(message.rediskey) {
      //fetch session info from redis
      redisclient.get(message.rediskey, function(e, c) {
        client.user_logged_in = c.username;
      });
    }

  });
});
用户回答回答于

生成一个唯一的套接字ID并由Pusher发送给浏览器。这通过AJAX请求发送到您的应用程序(1),该请求授权用户访问您的现有认证系统的频道。如果您的应用程序成功返回一个授权字符串给您与Pusher秘密签名的浏览器。这通过WebSocket发送给Pusher,如果授权字符串匹配,则完成授权(2)。

因为socket.io每个套接字也具有唯一的socket_id。

socket.on('connect', function() {
        console.log(socket.transport.sessionid);
});

他们使用签名授权字符串来授权用户。

我还没有把这个镜像反映出来socket.io,但我认为这可能是一个非常有趣的概念。

扫码关注云+社区