我的主应用程序是一个Django应用程序,但是,对于一些实时的东西,我想使用Node / Socket.IO。我正在使用Redis从Django到Node(再到各种客户端)做一些pub / sub。棘手的部分是如何根据Django身份验证对Node用户进行身份验证?
在我的节点应用中,我有:
io.on('connection', function (socket) {
const subscribe = redis.createClient();
var userId = authenticateAndGetUserId();
subscribe.subscribe(userId + ':feed-items');
subscribe.on('message', function (channel, message) {
socket.emit('feed-items', JSON.parse(message));
});
});
所以我的问题是实施authenticateAndGetUserId
的好策略是什么?会话在MySQL中支持,所以我可以通过那里。只是好奇是否有更好的方法去做。
答案 0 :(得分:3)
在Django方面,我会公开一个REST API。然后在Node.js上,您可以执行类似POST用户名/密码的操作
http://yourdjangoserver.com/authenticate
这将返回一些包含您需要的信息的JSON。如果您希望保护API不受公众监督,请将其设为私有或使用基本身份验证等方式保护它。
restify是一个npm包,可以很容易地在Node.js端使用REST API。这种架构的好处是松散耦合。您可以用任何东西替换Django,而客户端永远不会知道。
答案 1 :(得分:3)
由于您已经拥有一台redis服务器,因此您可以为每个登录用户存储(username, sessionkey)
对,也可以选择与您的会话设置相对应的TTL值。
然后,每当用户请求订阅频道时,他就会发送他的用户名,然后根据redis数据存储进行检查。