使用Socket.io,Angular,JWT Authenitication数据直到用户认证刷新后才可用

时间:2016-02-24 22:19:23

标签: angularjs node.js authentication socket.io jwt

我使用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);
});

0 个答案:

没有答案