使用Node/Express/Socket.IO进行身份验证

Mar*_*cus 4 authentication credentials node.js express socket.io

我有一个连接到HTML文件的node/socket.io/express服务器(如此).因此,访问Web地址会将您连接到服务器.我正在尝试建立一个系统,其中服务器一次在多台计算机上运行,​​并通过某种用户名和密码身份验证,访问具有特定凭据的网页将您连接到具有相同权限的计算机之一运行服务器的凭据.

我见过以前类似的问题提到"Redis",但它们已经很老了,我想知道是否有更新或更好的方法来实现这一点.

xSh*_*ase 16

你不会找到很多最新的文档,因为Express 4是一种新的,所以让我试着在这里解决这个问题:

Express 4.x和Socket.IO 1.x中的身份验证

让我们从一个混乱开始,我认为你正在制造:

  • 什么是Redis?

    Redis是一个数据结构引擎.它允许您存储键/值对,仅此而已(在此上下文中).在构建身份验证系统时,它唯一能为您做的就是存储数据,用户信息,会话ID等.在您的情况下,您可以在多台计算机之间共享存储,就像共享数据库一样,或者一个文本文件.

    Redis的

  • 验证用户到节点/快速服务器

    其中一种方法是使用护照.Passport是一个专门用于Node.js身份验证的中间件.它适用于Express,相对容易设置.有一个关于如何使用快递应用程序设置护照的优秀教程系列,所以我不会详细介绍这一部分,请花时间阅读系列,这是非常宝贵的知识.

    这是第一部分的链接,这是我将在下一步中关注的部分.

  • 将socket.io添加到混合中

    Socket.io无权访问您在第1部分中创建的会话cookie.为了解决这个问题,我们将使用passport-socketio模块.

    Passport-socketio需要本地会话存储,而不是内存存储.这意味着我们需要某种方式将会话数据存储在某个地方,这是否会响铃?

    确切地说, Redis.

    您可以尝试其他商店,如mongoDB或MySQL,但Redis是最快的.

    在这个例子中,我假设你的快递应用程序和护照已经运行,并将专注于将socket.io添加到应用程序.

  • 建立 :

var session = require('express-session'); //You should already have this line in your app
var passportSocketIo = require("passport.socketio");
var io = require("socket.io")(server);
var RedisStore = require('connect-redis')(session);

var sessionStore = new RedisStore({ // Create a session Store
   host: 'localhost',
   port: 6379,
});

app.use(session({
  store: sessionStore,  //tell express to store session info in the Redis store
  secret: 'mysecret'
}));

io.use(passportSocketIo.authorize({ //configure socket.io
   cookieParser: cookieParser,
   secret:      'mysecret',    // make sure it's the same than the one you gave to express
   store:       sessionStore,        
   success:     onAuthorizeSuccess,  // *optional* callback on success
   fail:        onAuthorizeFail,     // *optional* callback on fail/error
}));
Run Code Online (Sandbox Code Playgroud)

Connect-redis是一个使用redis的会话存储包(如果名称不明显).

  • 最后一步:
function onAuthorizeSuccess(data, accept){  
  console.log('successful connection to socket.io');
  accept(); //Let the user through
}

function onAuthorizeFail(data, message, error, accept){ 
  if(error) accept(new Error(message));
  console.log('failed connection to socket.io:', message);
  accept(null, false);  
}

io.sockets.on('connection', function(socket) {
  console.log(socket.request.user); 
});

Run Code Online (Sandbox Code Playgroud)

在socket.request中找到的用户对象将包含登录用户的所有用户信息,您可以传递它,或者从这一点做任何您需要的用户信息.

注意:对于Socket.IO <1.x,此设置略有不同