【问题标题】:Firebase: Securing records by email address when users can use fake addressesFirebase:当用户可以使用虚假地址时,通过电子邮件地址保护记录
【发布时间】:2018-07-07 12:43:18
【问题描述】:

我正在制作一个网络应用程序,您需要先付费才能使用它然后登录。注册工作流程是这样的:

  • 在我的网站上完成付款后,客户会收到与其电子邮件地址相关联的订单 ID。客户端将此发送到 Firebase Function 端点以激活他们的订单。

  • Firebase 函数检查订单 ID 是否有效,并使用长随机密码创建 Firebase 用户(以防止任何人登录),然后发送密码重置电子邮件。一条“付款”记录在 Firestore 中创建并与用户 ID 相关联。

  • 用户按照密码重置电子邮件登录我的应用程序。如果 Firestore 包含与该用户 ID 关联的付款,则会激活付费功能。

这一切看起来都很好,除了:

  1. 恶意用户 Bob 可能会在我的控制之外为他不拥有的电子邮件“x@example.com”创建一个用户并使用 Firebase 客户端 SDK 登录。

  2. Alice 然后为她的电子邮件“x@example.com”付款。

  3. Bob 仍将登录,现在可以使用 Alice 支付的功能。

如何防止这种情况发生?

我的一个想法是上述 Firebase 函数可以检查用户“x@example.com”是否存在未验证的电子邮件地址,如果存在,它将 1)删除该用户,2)再次为该电子邮件地址创建一个用户(创建一个新的唯一用户 ID)。然后 Bob 将拥有与电子邮件地址关联的用户 ID 不同的用户 ID,因此无法访问付款记录。但是,如果 Alice 在第一次付款后没有验证她的电子邮件就进行了两次付款,这就会中断。解决这个问题的可靠方法是什么?

【问题讨论】:

  • 这看起来很复杂。为什么不让他们先创建一个访问受限的帐户并解除支付限制?
  • @Vincent 如果您是这个意思,我不希望他们必须先注册。收取第一笔付款会增加摩擦,从而降低转化率。

标签: firebase firebase-authentication google-cloud-functions payment


【解决方案1】:

考虑在处理交易之前验证电子邮件。 一种选择是使用sign in with email link。这将登录用户并验证他们的电子邮件。如果需要,您还可以在之后设置密码。如果现有未经验证的提供商与该帐户相关联,则该帐户将被取消链接,并且恶意用户之前设置的任何现有会话都将被撤销。

【讨论】:

    猜你喜欢
    • 2013-04-13
    • 2014-02-20
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多