Estoy desarrollando API RESTful en express, con JWT y pasaporte para autorización. Quiero implementar la conexión socket.io para fines de notificación y señalización (establecimiento de sesión WebRTC). No quiero implementar la gestión de sesión estándar, no quiero tratar con cookies, pero de alguna manera tengo que poder dirigirme a un usuario en particular a través de un socket. Tengo manejo de eventos en todas mis rutas, por lo que la aplicación está al tanto de las solicitudes de autenticación y las identificaciones de usuario correspondientes. Un enfoque (probablemente) es crear un grupo de socket io con identificación de usuario, agregar un socket a este grupo y emitir allí. (Participar en el manejo de la reconexión y verificar la existencia del socket en cada solicitud posterior, eso es demasiado complicado). Supongo que debería haber un mejor enfoque. También uso Redis, así que puedo aprovechar eso en este esquema. Se agradece cualquier sugerencia, gracias
Bueno, me las arreglé para resolver eso de esa manera.
Servidor:
import jwt from 'jwt-simple'; //I'm using ES6/Babel module.exports = function(app) { var io = app.get('io'); //Import io any possible way, //here I do it like so because I set //app.set('io', io) in my index.js var user_id; io.on('connection', socket => { // Recieve encoded token from client, decode and find user id // To do - check againt database socket.on('auth', token => { if (token) { var decoded = jwt.decode(token, 'secret') user_id = decoded.sub socket.emit('auth', user_id); } }) // Join room proposed by client - user id string socket.on('room', room => { socket.join(room) console.log('Server joined room...', room) //emit message to user id from anywhere in the app io.sockets.in(user_id).emit('message', 'what is going on, party people?'); }) }) }cliente:
var token = localStorage.getItem('token'); var socket = io(); socket.on('connect', data => { socket.emit('auth', token); socket.on('auth', user_id => { socket.emit('room', user_id); }) })Ahora, para dirigirme a un usuario específico, siempre puedo emitir a la identificación de la habitación igual a la identificación del usuario, siempre que el usuario tenga credenciales. Incluso después de actualizar el navegador.
Foto: el cliente de la izquierda tiene un token válido en localStorage, el de la derecha no