2012-05-06 117 views
7

我的主应用程序是一个Django应用程序,但是,对于某些实时的东西,我想使用Node/Socket.IO。我使用Redis做一些从Django到Node的pub/sub(然后到各种客户端)。棘手的部分是我如何根据Django身份验证来验证Node用户?如何使用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支持,所以我可以在那里通过。只是好奇,如果有更好的方法去做。

回答

4

在Django端我会公开一个REST API。然后在Node.js的,你可以做这样的事情POST用户名/密码

http://yourdjangoserver.com/authenticate

它会返回一些JSON你所需要的信息。如果您希望保护API免受公众监督,则可以将其设为私有或使用基本身份验证等方式加以保护。

restify是一个npm包,它使Node.js端的REST API非常容易使用。这种架构的好处是松散耦合。你可以用任何东西代替Django,客户永远不会知道。

+2

这个。我在我的Django用户配置文件模型中创建了一个'api key'字段,密钥是随机生成的。然后,您可以拥有一个简单的HTTP端点/ API,它接受该密钥并确定它是否属于有效用户。 – maroonmed

+0

这不会使node.js阻塞吗?在这种情况下,node.js有什么用呢? –

+0

我不明白为什么会让Node.js阻止 – deltanovember

2

由于您已经有了redis服务器,因此您可以为每个登录用户存储(username, sessionkey)对,并且可以选择使用与您的会话设置相对应的TTL值。

然后,每次用户请求订阅某个频道时,他都会发送他的用户名,然后再根据redis数据存储进行检查。

+1

我喜欢这个。 – emostafa

相关问题