6

我正在使用angularFireAuth并且 angularFireAuth 提供了一个登录的用户变量。假设$scope.user.id我用它来验证当前用户是否登录。我也angularFireAuth.logout()用来注销用户。

在单个打开的浏览器选项卡上一切正常。

但它不适用于多个选项卡。

  • 该选项卡的登录 1WILL NOT登录其他选项卡并设置登录variables
  • 选项卡的注销 1DOES NOT清除其他选项卡variables并注销。

所以这意味着

我打开了 2 个标签,我称之为tab Atab B。当我注销或登录选项卡 A时。

Tab B也不会。同时,如果我提交了一些需要在选项卡 b中进行身份验证的内容(该选项卡 A 已经注销)。我仍然可以提交。(除非我手动刷新)。

4

1 回答 1

0

如果您在返回第二个选项卡时刷新浏览器,则存储在本地存储中的身份验证应该会更新。

您还可以利用本地存储事件与同一域上的其他选项卡和窗口共享事件。在 firebase 的情况下,用户应该在本地存储中自动更新,并启动一个事件。

监听存储更改事件,然后使用 firebase getAuth 或在 angularFireAuth 中调用 getAuth 的 API。

可能看起来像:

function onStorageEvent(storageEvent){
    var authData = ref.getAuth();
    if (authData !== null) {
       // you're logged in
    }
}

为了安全起见,允许您指定应处理的操作或事件的消息传递协议可以使用本地存储(每次存储状态更改时您都会收到一个事件,请确保在存储中有一个消息字段可以更新和仅根据更新该消息数组的事件完成其他选项卡上的操作,此处也应涉及更多安全性)。

只有在用户先前已注销时才需要共享存储消息,并且其目的是,当在不同的选项卡中完成登录时,所有打开的浏览器选项卡都应更改为已登录状态。登录后,TabA 接收的所有通过 websocket 接收的 firebase 事件也应由 TabB 接收,因此不需要跨页通信。

于 2016-05-05T07:28:41.880 回答