防止重复的窗口/标签

时间:2018-03-21 23:32:22

标签: php mysql architecture email-verification

我已经为我的网站设置了电子邮件验证。

用户注册后,系统会提示他们通过已通过电子邮件发送给他们的链接验证其帐户。如果用户点击该链接,它会激活他们的帐户并将其带到登录屏幕,但当然是在新标签中。

也许我是强迫症,但我的问题是如果有人在注册后立即验证他们的帐户而没有关闭第一个标签,他们将在点击验证链接后在登录屏幕上打开两个标签。 如果已打开具有相同域的标签,是否有任何方法可以阻止此操作或使用相同的标签?或者是否有更好的架构可供使用?

我已经设置了验证过程,以便我的数据库中有两个单独的表。

users_unverified(表A)

account_email | account_password | token | entry_time | num_id (primary)

users_verified(表B)

account_email | account_password | joined | ...

这个过程可以这样分解:

  1. 用户使用电子邮件和密码注册,这会创建一个令牌
  2. 通过验证链接
  3. 将令牌通过电子邮件发送给他们
  4. 用户通过链接注册后(如果令牌匹配且未过期),account_emailaccount_password将从users_unverified转移到users_verified并收到确认消息显示
  5. users_unverified中的记录已删除
  6. 是否有不同或更好的方法可以让我避免同时打开两个标签的可能性?

1 个答案:

答案 0 :(得分:1)

一般情况下,我认为您不必担心,用户会明白点击电子邮件中的链接会打开浏览器标签,然后他们就会完成整个过程。

虽然如果你想这样做,你可以使用localStorage设置窗口已经打开的状态,并使用BroadcastChannel在选项卡之间发送数据(例如发送哈希回来您的窗口,以便您可以显示要求验证其电子邮件或进行重定向的DOM

以下是一个例子:

这个javascript将在注册页面上:

<script type="text/javascript">
    var channel = new BroadcastChannel("linkopened");
    channel.onmessage = function(e) {
        // do something with data sent from other tab
        alert('Email link opened, show DOM or redirect: ' + e.data)
    };

    localStorage.setItem('pageopen', true);
    window.onbeforeunload = function() {
        localStorage.removeItem('pageopen');
    };
</script>

这将出现在一个新选项卡中打开的页面上:

<script type="text/javascript">
    if (localStorage.getItem('pageopen')) {
        var channel = new BroadcastChannel("linkopened");
        channel.postMessage('Some special link or hash');
        window.close();
    }
</script>