2012-05-06 159 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

相關問題