Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Meteor 流星。确保用户只登录到一个选项卡?_Meteor - Fatal编程技术网

Meteor 流星。确保用户只登录到一个选项卡?

Meteor 流星。确保用户只登录到一个选项卡?,meteor,Meteor,如果人们从多个选项卡/浏览器登录我的Meteor 1.3.1应用程序,他们将遇到问题 因此,当用户登录时,我希望在其他任何地方将其注销,并将其放在“you logred in other”页面上 我尝试了两件事:Accounts.logoutOtherClients()看起来很有希望,但似乎已经失败了。这会让所有人都退出 if (Meteor.isClient) { // FF 1 tab, Chrome 2 tabs. // FF login -> chrome logs out

如果人们从多个选项卡/浏览器登录我的Meteor 1.3.1应用程序,他们将遇到问题

因此,当用户登录时,我希望在其他任何地方将其注销,并将其放在“you logred in other”页面上

我尝试了两件事:Accounts.logoutOtherClients()看起来很有希望,但似乎已经失败了。这会让所有人都退出

if (Meteor.isClient) {
  // FF 1 tab, Chrome 2 tabs.
  // FF login -> chrome logs out ok.
  // Chrome login -> FF logs out.  Then Chrome other tab logs in.  Then both Chrome tabs logout.
  Accounts.onLogin(function() {
    console.log(Meteor.loggingIn()); // false.  See https://github.com/meteor/meteor/issues/1616
    Accounts.logoutOtherClients();
  });
}
在此之前,我正在开发一个手动解决方案,但它看起来像Meteor.logout()会在同一个浏览器中注销两个选项卡。我能得到的最好结果是
window.location=”https://google.com“

注意:如果用户关闭所有选项卡,则以下方法不起作用。当他们重新打开应用程序时,他们没有tabToken,因此无法再次登录

怎么做

我认为最好的方法是:

1) 在客户端的Meteor.start()上创建一个唯一的tabToken 2) 将令牌保存到客户端上的会话变量 3) 登录时将tabToken保存给用户 4) 在客户端上,收听Meteor.user().profile以了解tabToken更改

if (Meteor.isClient) {

  // Make a unique tabToken at startup.
  Meteor.startup(function() {
    var tabToken = (0|Math.random()*9e6).toString(36);  // jshint ignore:line
    Session.set('tabToken', tabToken);
    console.log('startup TabToken ' + Session.get('tabToken'));
  });

  // onLogin, set the active tab to our tabToken
  Accounts.onLogin(function() {
    Meteor.call('setActiveTab', Session.get('tabToken'), function() {
      // When method returns, watch profile for tabToken changes
      console.log('setActiveTab tabToken ' + Session.get('tabToken'));
      console.log('setActiveTab Meteor.user().profile.tabToken ' + Meteor.user().profile.tabToken);

      Tracker.autorun(function (c) {
        // If the tabToken changes to a different token, logout
        if (Meteor.user()) {
          var userTabToken = Meteor.user().profile.tabToken;
          if (userTabToken && !Session.equals('tabToken', userTabToken)) {
            window.location = 'https://google.com';
            // Doesn't work
            // c.stop();
            // Meteor.logout(); // ERROR this logs out all tabs in browser.
            // Router.go('loggedOut');
          }
        }
      });
    });
  });
}

// Make a meteor method to set tabToken
if (Meteor.isServer) {
  Meteor.methods({
    setActiveTab: function(tabToken) {
      if(!tabToken) throw new Meteor.Error('noTabToken');
      console.log('setActiveTab ' + tabToken);
      if (!Meteor.user()) return;
      Meteor.users.update(Meteor.userId(), {
        $set: {
          'profile.tabToken': tabToken
        }
      });
    }
  });
}
这看起来真的很糟糕。还有其他建议吗


迈克

我知道这没有什么帮助,但你应该修复你的应用程序。跨标签同步(使用html5本地存储)是Meteor帐户的核心功能。此外,意外注销确实很糟糕(是的,这没有什么帮助。如果这是我需要的答案,我会问这个问题。多个标签实际上会让我的应用程序产生不好的用户体验。对不起,我不是故意粗鲁。也许可以帮你吗?每当创建新的DDP连接时,就会调用它。如果每个用户只能有一个活动的DDP会话,你可以轻松地禁用c。)客户端应用程序中的onflicting功能,并允许用户通过单击重新激活。这样,您就不必注销用户。(我知道,这不是您要求的,很抱歉。)啊哈!太棒了!那就更好了!当一个用户有多个选项卡时会导致什么问题?我知道这并没有真正的帮助,但你应该修复你的应用程序。跨选项卡同步(使用html5本地存储)是Meteor帐户的一个核心功能。此外,意外注销确实很糟糕(是的,这没有什么帮助。如果这是我需要的答案,我会问这个问题。多个标签实际上会让我的应用程序产生不好的用户体验。对不起,我不是故意粗鲁。也许可以帮你吗?每当创建新的DDP连接时,就会调用它。如果每个用户只能有一个活动的DDP会话,你可以轻松地禁用c。)客户端应用程序中的onflicting功能,并允许用户通过单击重新激活。这样您就不必注销用户。(我知道,这不是您要求的,对此表示抱歉。)啊哈!太棒了!那更好了!当用户有多个选项卡时会导致什么问题?