我正在快递上开发RESTful API,使用JWT和护照进行授权。我想实现socket.io连接以用于通知和信令目的(WebRTC会话建立)。我不想实现标准会话管理,不想处理cookie,但不知何故,我必须能够通过套接字解决特定用户。我在所有路线中都有事件处理,因此app知道已授权的请求和相应的用户ID。一种方法(可能)是使用用户ID创建socket io组,向该组添加套接字并在那里发出。 (在每个后续请求中使用重新连接处理和检查套接字存在 - 这样做过于复杂)。我想应该有更好的方法。我也使用Redis,所以我可以在这个方案中利用它。任何建议表示赞赏,谢谢
答案 0 :(得分:0)
好吧,我设法以这种方式解决了这个问题。
服务器:
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?');
})
})
}
客户端:
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);
})
})
现在要解决特定用户的问题,如果用户有凭据,我总是可以发出等于用户ID的房间ID。即使在浏览器刷新之后。
Photo: the left client has valid token in localStorage, the right one doesn't