Firebase电子邮件/密码验证+验证异常

时间:2019-02-20 03:18:35

标签: swift firebase firebase-authentication email-verification

对于绝对需要在用户开始使用该服务之前需要进行电子邮件验证的服务,使用电子邮件验证+电子邮件/密码验证并不完全有效。

让我以首先登录Google 为例。

首先,用户登录自己的Google帐户(例如电子邮件为op@op.com)并授权您的应用。然后,您使用通过该证书接收到的令牌创建一个凭证,并与Firebase交换这些令牌以将用户登录到Firebase。用户需要存在于Firebase中才能使用Firebase的电子邮件验证服务(因为获取有关电子邮件是否已验证的信息的唯一方法是检查客户端中的currentUser对象,因此您需要登录用户检查其电子邮件是否已通过验证。您无法通过电子邮件地址调用Auth方法来检查其电子邮件是否已通过验证)。因此,一旦您将用户登录到Firebase,便向他们发送了验证链接,一切都很好。您可以通过检查用户对象以进行电子邮件验证来在客户端上配置视图。这里要注意的重要一点是,其他知道该用户电子邮件地址的其他用户无法在您的服务上使用op@op.com进行注册:这是因为他们需要使用该电子邮件登录Google进行注册。

在这方面,Facebook与Google登录类似。

但是,对于电子邮件/密码,任何人都可以接收别人的电子邮件并使用它创建一个帐户!而且,由于您无法在用户在Firebase中注册之前发送验证链接,因此实际上,您是在让世界上的任何人“阻止”您服务中的电子邮件地址。我最初是在尝试将电子邮件注册到Firebase中之前确保电子邮件验证,但是很快意识到我需要Firebase中的用户进行任何电子邮件验证。

我是否缺少某些东西,或者这是预期的行为?如果确实如此,那么我可能只是不允许在我的应用程序中登录电子邮件/密码。

附带说明:我的另一个想法是通过向他们发送6位数代码进行验证,并在Firebase中维护我自己的验证系统。但是后来我无法为其添加任何安全规则,因为任何没有登录用户的客户端都需要访问它==>潜在的系统滥用。

预先感谢您尝试阅读详细的解释。

1 个答案:

答案 0 :(得分:0)

因此,即使可以未经验证创建帐户,也可以使用安全规则阻止用户访问。后者很重要,并控制访问。这是一个使用实时数据库规则的示例:

{
  "rules": {
    "users": {
      "$user": {
        ".read": "auth.token.email_verified == true && auth.uid === $user",
        ".write": "auth.token.email_verified == true && auth.uid === $user"
      }
    }
  }
}

如果要通过解析令牌有效负载并检查email_verified来验证服务器上的ID令牌,也可以自己执行此操作。

因此,即使创建了用户帐户,除非验证用户身份,否则他们将无权访问您的应用程序/站点数据。