管理邀请代码以便向Firebase注册

时间:2015-01-31 14:46:15

标签: angularjs firebase angularfire firebase-security firebasesimplelogin

我正在教自己AngularJS和Firebase,并正在开发一个具有两个用户角色A和B的应用。角色B只有在拥有有效邀请码的情况下才能注册到该网站。

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

我的注册表单包含的字段多于电子邮件/密码。用户ID,电子邮件,通行证由Firebase在内部处理并成功存储。此外,我在另一个名为" accounts"

的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"在"帐户内#34;文档写入访问" inviteCodes"文献。这是要走的路还是另外一种方式?因为在这种情况下,生成代码的方法仍然存在。

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;
  }
}

但同样,在此查询中,所有代码都将暴露给前端。 是否可以检查所提供的代码是否有效而不暴露所有代码?

感谢您的意见。

1 个答案:

答案 0 :(得分:4)

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

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

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

-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()

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

通过这种方式,您无需为其他用户检索邀请。