首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Socket.IO身份验证

Socket.IO身份验证
EN

Stack Overflow用户
提问于 2011-01-21 07:43:04
回答 3查看 78.7K关注 0票数 131

我正在尝试在Node.js中使用Socket.IO,并尝试允许服务器为每个Socket.IO客户端提供一个标识。因为套接字代码不在http服务器代码的范围内,所以它不容易访问发送的请求信息,所以我假设它需要在连接期间发送。最好的方法是什么

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

2)验证他们所说的身份(我目前正在使用Express,如果这能让事情变得更容易的话)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-01-21 10:20:25

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

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

例如:

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

代码语言:javascript
复制
req.session.regenerate...
res.send({rediskey: req.sessionID});

客户端:

代码语言:javascript
复制
//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});
});

服务器端:

代码语言:javascript
复制
//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;
      });
    }

  });
});
票数 107
EN

Stack Overflow用户

发布于 2014-01-16 23:01:18

我知道这有点老了,但是对于未来的读者来说,除了解析cookie和从存储中检索会话的方法之外(例如:passport.socketio ),您也可以考虑基于令牌的方法。

在本例中,我使用了非常标准的JSON Web令牌。您必须向客户端页提供令牌,在本例中,假设有一个身份验证端点返回JWT:

代码语言:javascript
复制
var jwt = require('jsonwebtoken');
// other requires

app.post('/login', function (req, res) {

  // TODO: validate the actual user user
  var profile = {
    first_name: 'John',
    last_name: 'Doe',
    email: 'john@doe.com',
    id: 123
  };

  // we are sending the profile in the token
  var token = jwt.sign(profile, jwtSecret, { expiresInMinutes: 60*5 });

  res.json({token: token});
});

现在,您的socket.io服务器可以进行如下配置:

代码语言:javascript
复制
var socketioJwt = require('socketio-jwt');

var sio = socketIo.listen(server);

sio.set('authorization', socketioJwt.authorize({
  secret: jwtSecret,
  handshake: true
}));

sio.sockets
  .on('connection', function (socket) {
     console.log(socket.handshake.decoded_token.email, 'has joined');
     //socket.on('event');
  });

socket.io-jwt中间件需要查询字符串中的令牌,因此在客户端,您只需在连接时附加它:

代码语言:javascript
复制
var socket = io.connect('', {
  query: 'token=' + token
});

我写了一个关于这个方法和cookies here的更详细的解释。

票数 30
EN

Stack Overflow用户

发布于 2012-05-05 20:29:46

这应该就行了

代码语言:javascript
复制
//server side

io.sockets.on('connection', function (con) {
  console.log(con.id)
})

//client side

var io = io.connect('http://...')

console.log(io.sessionid)
票数 -6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4753957

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档