【问题标题】:Socket io socket won't carry jwt token in angular factorySocket io socket 不会在 Angular 工厂中携带 jwt 令牌
【发布时间】:2015-07-15 08:52:39
【问题描述】:

我正在我的 MEAN 堆栈项目中尝试使用 jwt 进行 socket.io 授权。我在注销并重新登录后遇到套接字对象不携带 jwt 令牌的问题。

当我登录时,令牌将存储在本地存储中

    UsersSvc.login($scope.user).success(function(data){
        if (data.success) {
            store.set('jwt', data.token);
    }

然后角度套接字工厂将从本地存储中检索 jwt 并发送到服务器

.factory('SocketSvc',[ 'store',
 function (store) {
  this.initSocket = function(){
     return io.connect('http://localhost:3000',{ query : 'token='  + store.get('jwt')});
 };

 var socket = this.initSocket();

 return {
   on: function (eventName, callback) {
    socket.on(eventName, function () {  
     var args = arguments;
     $rootScope.$apply(function () {
      callback.apply(socket, args);
    });
  });
},
 emit: function (eventName, data, callback) {
   socket.emit(eventName, data, function () {
     var args = arguments;
     $rootScope.$apply(function () {
       if (callback) {
         callback.apply(socket, args);
       }
     });
   })
 },
};

然而;退出后

$scope.logout = function(){
    var account = UsersSvc.currentAccount();
    SocketSvc.emit('logout', { account : account});
    $state.go('anon.login');
};

然后 jwt toke 将从本地存储中删除

 if (toState.name == "anon.login") {
        store.remove('jwt');

当我再次登录时,套接字查询中的令牌在您成功登录时消失了。我正在处理这个问题几天。我不知道发生了什么。

让服务器再次获取令牌的唯一方法是手动刷新页面。 或关闭选项卡并打开一个新页面,然后重新登录。

我的假设是角度工厂的问题,因为它是无法修改的单例。

我不知道这是对还是错,也不知道如何解决问题。如果你有什么建议。请告诉我

【问题讨论】:

    标签: angularjs node.js socket.io mean-stack


    【解决方案1】:

    我通过将 initSocket 代码包装到返回块中的函数中解决了这个问题 您正确地指出令牌为空,因为用户未登录。

    this.initSocket = function(){
         return io.connect('http://localhost:3000',{ query : 'token='  + store.get('jwt')});
     };
    
     var socket = this.initSocket();
    

    上面的内容应该进入返回块并在任何控制器中调用一次以使用有效令牌初始化套接字

    我的灵魂:

    angular.module('mean1App')
      .factory('socket', function(socketFactory, $rootScope, Auth) {
        var socket = null;
        return {
          socket: socket,
    
          init: function(){
                var ioSocket = io.connect('http://localhost:9000', {
                  // Send auth token on connection, you will need to DI the Auth service above
                  'query': 'token=' + Auth.getToken(),
                  path: '/socket.io-client'
                });
    
                socket = socketFactory({
                  ioSocket: ioSocket
                });
          },
    ...
    ...blah 
      });
    

    【讨论】:

      猜你喜欢
      • 2016-01-29
      • 2018-09-30
      • 2016-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-02
      • 2019-02-07
      • 2018-07-11
      • 2019-12-10
      相关资源
      最近更新 更多