管理用于注册 Firebase 的邀请代码



我正在自学AngularJS和Firebase,并正在开发一个具有两个用户角色A和B的应用程序。

我正在使用Firebase作为后端和AngularFire绑定。我已经用Yeoman发电机发电机-angularfire建立了我的项目。后者提供Firebase基本密码/简单登录身份验证方法。

我的注册表单包含的字段不仅仅是电子邮件/密码。用户 ID、电子邮件、通行证由 Firebase 在内部处理并成功存储。此外,我在成功注册后将其他字段保存在另一个名为"帐户"的 Firebase 文档中:

"accounts": {
    "simplelogin:16" : {
      "company" : "foo corp",
      "firstName" : "lorem",
      "lastName" : "ipsum",
      "type" : "userRoleA"
    },
    "simplelogin:19" : {
      "company" : "bar corp",
      "firstName" : "dolor",
      "lastName" : "sit",
      "type" : "userRoleA"
    },
    "simplelogin:17" : {
      "city" : "new york",
      "firstName" : "asd",
      "lastName" : "asd",
      "type" : "userRoleB"
    },
    "simplelogin:18" : {
      "city" : "washington",
      "firstName" : "a",
      "lastName" : "a",
      "type" : "userRoleB"
    }
}

现在我正在尝试找到一种安全的方式来实现邀请代码功能。我添加了一个名为"inviteCodes"的Firebase文档:

"inviteCodes" : {
  "111" : {
    "generator" : "system"
  },
  "222" : {
    "generator" : "system"
  },
  "333" : {
    "generator" : "system"
  }
}

1 - 生成邀请码:我不能简单地将它们直接放入 Firebase 中,因为在后面的步骤中,我希望用户 A 能够生成这些代码。但是,如何在不将方法暴露给前端的情况下在Firebase上生成代码呢?我会通过添加 Firebase 规则来解决此问题,该规则仅授予"帐户"文档中类型为"userRoleA"的经过身份验证的用户对"邀请代码"文档的写入访问权限。这是要走的路,还是有其他方法?因为在这种情况下,生成代码的方法仍然公开。

2 - 假设 1) 已求解,并且邀请代码位于 Firebase 文档中。注册后,在调用$createUser方法之前,我需要检查提供的邀请码是否有效。我会查询Firebase并检查提供的代码是否与任何保存的邀请代码匹配。像这样的东西(用于说明的虚拟代码):

var firebaseCodes = firebaseRefInviteCodes;
var providedCode = registrationForm.providedCode;
var isCodeValid = false;
for (var i = 0; i < firebaseCodes.length; i++) {
  if (firebaseCodes[i] === providedCode) {
    isCodeValid = true;
  }
}

但同样,在此查询中,所有代码都将公开到前端。有没有办法在不公开所有代码的情况下检查提供的代码是否有效?

感谢您的输入。

为了生成邀请,我认为前端这样做没有任何问题 - 直到它是一个安全的随机令牌生成器。您也可以让 Firebase 生成它:

var inviteCode = firebaseRef.push().key();

安全规则是保护 Firebase 中应用数据的有效方法。但是,为了使它们正常工作,您必须以正确的方式设计数据结构。在这种情况下,"关系"数据库方法将不起作用。问题在于用户 A 仅与用户 B 共享邀请,其他人必须能够"看到"它们。因此,将所有访问代码存储在一个"表"中不是一个好的选择。我假设当用户 A 创建邀请时,它知道此邀请适用于哪个用户。在这种情况下,您可以设计类似于以下内容的数据结构:

-inviteCodes
    -invitee
        -{$userB_email}
            -code: {codeValue}
            -inviterId: {userAId}
            -generator: "system"

使用此结构,安全规则可以如下所示:

/inviteCodes/invitee - public, so userA can insert new invite code for userB
/inviteCodes/invitee/{userB_email} - write new data - public, read - private, can be accessed only by userB, e.g. data.exists() && newData.child('email').val() === $userB_email && newData.child('inviteCode').val() === data.child('code').val()

生成代码的用户 A 还可以存储为其生成代码的用户的电子邮件,然后它还可以使用电子邮件及其 inviterID 访问此数据。

这样,您就不必检索其他用户的邀请。

最新更新