Meteor 流星。确保用户只登录到一个选项卡?
如果人们从多个选项卡/浏览器登录我的Meteor 1.3.1应用程序,他们将遇到问题 因此,当用户登录时,我希望在其他任何地方将其注销,并将其放在“you logred in other”页面上 我尝试了两件事:Accounts.logoutOtherClients()看起来很有希望,但似乎已经失败了。这会让所有人都退出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
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功能,并允许用户通过单击重新激活。这样您就不必注销用户。(我知道,这不是您要求的,对此表示抱歉。)啊哈!太棒了!那更好了!当用户有多个选项卡时会导致什么问题?