我使用Angular和Socket.io,socket-jwt来验证套接字,并使用前端的angular-socket-io。
当页面加载时,客户端会尝试连接到socket.io服务器。它被拒绝是因为它们没有为客户建立令牌。
当建立套接字连接时,我正在解码服务器上的令牌,然后我想向客户端发送数据,包括socket.id,我将更新模型和视图。
用户进行身份验证后,直到刷新页面才会使socket.io数据可用,然后发送给客户端。
如何在用户登录并使数据可用后建立socket.io连接?
我尝试在用户登录后使用登录控制器内的socket.connect()和io.connect()调用我的套接字工厂。
套接字工厂
app.factory('socket', function ($window, socketFactory) {
var token = $window.localStorage.yourTokenKey;
var myIoSocket = 'http://localhost:8080';
var socket = io.connect(myIoSocket, {'query' : 'token=' + token});
return socket;
});
登录控制器中的登录功能
$scope.login = function() {
AuthService.login($scope.user)
.then(function(msg) {
socket.connect();
$state.go('home');
}, function() {
console.log('Login Failed');
});
};
服务器代码
var socketIo = require('socket.io');
var io = socketIo.listen(server);
io.use(socketioJwt.authorize({
secret: config.secret,
handshake: true
}));
io.on("connection", function(socket) {
var token = socket.handshake.query.token;
var decoded = jwt.decode(token);
var user = {
name: decoded._doc.name,
userId: decoded._doc._id,
socketId: socket.id
};
socket.emit(‘other event’, user);
});