2012-05-06 18 views
7

Mi aplicación principal es una aplicación de Django, sin embargo, para algunas cosas en tiempo real, quiero usar Node/Socket.IO. Estoy usando Redis para hacer algún pub/sub de Django a Node (y luego a varios clientes). La parte difícil es cómo autenticar al usuario del nodo frente a la autenticación de Django.¿Cómo autentico a un usuario en una aplicación de nodo con autenticación de Django?

En mi aplicación de nodo, que tengo:

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)); 
    }); 

}); 

Así que mi pregunta es ¿qué es una buena estrategia para la implementación de authenticateAndGetUserId? Las sesiones están respaldadas en MySQL, así que puedo ir allí. Sólo curiosidad si hay una mejor manera de hacerlo.

Respuesta

4

En el lado de Django expondría una API REST. Luego, en el Node.js que podría hacer algo como la POST nombre de usuario/contraseña para

http://yourdjangoserver.com/authenticate

que devolverá un poco de JSON con la información que necesita. Si deseas proteger la API del escrutinio público, hazla privada o protégela con algo así como autenticación básica.

restify es un paquete npm que hace que sea muy fácil trabajar con las API REST en el lado Node.js. Lo bueno de esta arquitectura es que está ligeramente acoplada. Podrías reemplazar a Django con cualquier cosa y el cliente nunca lo sabría.

+2

Esto. Creo un campo 'clave de API' en mi modelo de perfil de usuario Django, con la clave generada aleatoriamente. A continuación, puede tener un punto final/API HTTP simple que tome esa clave y determine si pertenece o no a un usuario válido. – maroonmed

+0

¿No haría eso que node.js bloqueara? ¿Cuál es el uso de node.js en tal caso, entonces? –

+0

No veo por qué eso haría que Node.js bloqueara – deltanovember

2

Dado que ya tiene un servidor redis, puede almacenar (username, sessionkey) pares por cada usuario conectado, opcionalmente con un valor TTL correspondiente a la configuración de la sesión.

Luego, cada vez que un usuario solicita la suscripción a un canal, envía su nombre de usuario, que luego se compara con el almacén de datos redis.

+1

me gusta este. – emostafa

Cuestiones relacionadas