我有一个连接到HTML文件的节点/ socket.io / express服务器(如so)。因此,访问Web地址会将您连接到服务器。我正在尝试建立一个系统,其中,服务器一次在多台计算机上运行,并通过某种用户名和密码身份验证,访问具有特定凭据的网页将您连接到具有相同凭据的计算机之一运行服务器的凭据。
我从之前的类似问题中看到了“Redis”的提及,但它们已经很老了,我想知道是否有更新或更好的方法来实现这一目标。
答案 0 :(得分:16)
你不会发现很多最新的文档,因为Express 4有点新,所以让我试着在这里解决这个问题:
让我们从一个混乱开始,我认为你正在制造:
什么是Redis?
Redis是一个数据结构引擎。它允许您存储键/值对,仅此而已(在此上下文中)。在构建身份验证系统时,它唯一能为您做的就是存储数据,用户信息,会话ID等。在您的情况下,您可以在多台计算机之间共享存储,就像共享数据库一样,或者一个文本文件。
向用户验证节点/快速服务器
您可以通过passport使用其中一种方法。 Passport 是一个专门用于Node.js身份验证的中间件。它适用于Express,相对容易设置。关于如何使用快递应用程序设置护照的优秀教程系列,所以我不会详细介绍这一部分,请花时间阅读系列,这是非常宝贵的知识。
Here's the link to the first part,这是我将在下一步重点关注的内容。
将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
}));
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);
});
在socket.request中找到的用户对象将包含登录用户的所有用户信息,您可以传递它,或者从这一点开始执行任何操作。
注意:对于Socket.IO,此设置略有不同。 1.x的