首页 > 解决方案 > 如何确保电子邮件只登录一次?

问题描述

我为特定范围的用户创建了一个小的 chrome 扩展。如何确保用户仅在一台计算机上登录,以避免在没有用户付费的情况下共享扩展?

有什么办法吗?

对于其他应用程序,我检查 UUID 并将其与我的用户列表进行比较。

我很难理解识别 API tbh。

这是我目前的方式,但它只跟踪用户是否在我的列表中。它在我的 popup.JS 文件中,因此当用户单击扩展图标时会触发它。

编辑:

(function () {
    chrome.identity.getProfileUserInfo({ 'accountStatus': 'ANY' }, async function (info) {
        email = info.email;
        console.log(info.id);

        let response = await fetch('https://pastebin.com/');
        let data = await response.text();

        console.log(data.indexOf(info.id));

        if (info.id === '') {
            chrome.browserAction.setPopup({ popup: 'index.html' });
            alert(info.id);
        } else if (data.indexOf(info.id) !== -1) {
            console.log('License is valid');
        } else {
            chrome.browserAction.setPopup({ popup: 'index.html' });
            alert(info.id);

            // block chrome extension usage;
        }
    });
})();

标签: javascriptgoogle-chrome-extensionoauth-2.0oauthgoogle-oauth

解决方案


请注意,我的回答是基于我的意见。如果我碰巧错了,请随意使用另一个答案。

我假设您有一个服务器,您可以在其中用作 Chrome 扩展程序的主数据库。

所以,看看你的用例,如果我是你,我会尝试实现像 Redis 这样的有状态数据存储,以便存储/缓存登录用户的“状态”。当用户登录时,我会将他们的电子邮件存储在一个易于获取的数据结构中(最好具有O(1)复杂性)。如果该用户尝试使用另一台机器登录,它将很容易在数据存储中检测到,并且您无法在该机器上使用扩展程序 - 直到该用户在前一台机器上注销。如果您愿意,您甚至可以使后端中的会话无效。

为什么我选择 Redis?这是因为它是专为高性能应用程序设计的数据存储。大多数情况下,它用于缓存会话和状态,但您也可以毫不费力地将其用作传统数据库。

一个实现示例:

  • Redis 的数据结构很容易符合上述标准。这叫一套。Set 是一种只允许唯一元素的数据结构。

  • 如果用户登录。

akasha@Akashas-MacBook-Pro redis> % SADD auth <user_email>
  • 如果用户注销。
akasha@Akashas-MacBook-Pro redis> % SREM auth <user_email>
  • 如果用户尝试从另一台机器登录。
akasha@Akashas-MacBook-Pro redis> % SISMEMBER auth <user_email>
  • 这些命令非常不言自明,SADD是将成员添加到集合中,SREM删除,并且SISMEMBER将返回一个布尔值,无论是否value存在于集合中。非常适合会话管理!

  • 您还可以使用多种数据结构组合来更全面地适应您的用例!

例如使用哈希值:

基本上,它就像 JavaScript 中的对象数据结构。假设这是用户登录后将在 Redis 中执行的命令。

akasha@Akashas-MacBook-Pro redis> % HSET authentication:{user_email} email <user_email>
  • 如果用户注销,那么它也非常简单。
akasha@Akashas-MacBook-Pro redis> % DEL authentication:{user_email}
  • 如果用户尝试从另一台机器访问:
akasha@Akashas-MacBook-Pro redis> % HEXISTS authentication:{user_email}
  • 适合您的用例并对其进行自定义。

参考:


推荐阅读