【发布时间】:2018-07-07 12:43:18
【问题描述】:
我正在制作一个网络应用程序,您需要先付费才能使用它然后登录。注册工作流程是这样的:
在我的网站上完成付款后,客户会收到与其电子邮件地址相关联的订单 ID。客户端将此发送到 Firebase Function 端点以激活他们的订单。
Firebase 函数检查订单 ID 是否有效,并使用长随机密码创建 Firebase 用户(以防止任何人登录),然后发送密码重置电子邮件。一条“付款”记录在 Firestore 中创建并与用户 ID 相关联。
用户按照密码重置电子邮件登录我的应用程序。如果 Firestore 包含与该用户 ID 关联的付款,则会激活付费功能。
这一切看起来都很好,除了:
恶意用户 Bob 可能会在我的控制之外为他不拥有的电子邮件“x@example.com”创建一个用户并使用 Firebase 客户端 SDK 登录。
Alice 然后为她的电子邮件“x@example.com”付款。
Bob 仍将登录,现在可以使用 Alice 支付的功能。
如何防止这种情况发生?
我的一个想法是上述 Firebase 函数可以检查用户“x@example.com”是否存在未验证的电子邮件地址,如果存在,它将 1)删除该用户,2)再次为该电子邮件地址创建一个用户(创建一个新的唯一用户 ID)。然后 Bob 将拥有与电子邮件地址关联的用户 ID 不同的用户 ID,因此无法访问付款记录。但是,如果 Alice 在第一次付款后没有验证她的电子邮件就进行了两次付款,这就会中断。解决这个问题的可靠方法是什么?
【问题讨论】:
-
这看起来很复杂。为什么不让他们先创建一个访问受限的帐户并解除支付限制?
-
@Vincent 如果您是这个意思,我不希望他们必须先注册。收取第一笔付款会增加摩擦,从而降低转化率。
标签: firebase firebase-authentication google-cloud-functions payment