我正在制作一个Web应用程序,您需要付费才能首先使用它,然后登录。注册工作流程是这样的:
在我的网站上付款后,客户会收到与其电子邮件地址相关联的订单ID。客户端将此发送到Firebase Function端点以激活其订单。
Firebase函数检查订单ID是否有效,并使用长随机密码创建一个Firebase用户(以防止任何人登录),然后发送密码重置电子邮件。在Firestore中创建一个“付款”记录,并将其与用户ID关联。
用户遵循密码重置电子邮件,然后登录到我的应用程序。如果Firestore包含与该用户ID关联的付款,则会激活付费功能。
除了:
Bob可以在我控制范围之外的恶意用户创建一个他不拥有的电子邮件“ x@example.com”用户,并使用Firebase客户端SDK登录。
然后爱丽丝为她的电子邮件“ x@example.com”付款。
Bob仍将登录,现在可以使用Alice支付的功能。
如何防止这种情况?
我的一个想法是上述Firebase Function可以检查用户“ x@example.com”是否存在未验证的电子邮件地址,如果存在,则将1)删除该用户,2)再次为该电子邮件地址创建一个用户(创建一个新的唯一用户ID)。这样,鲍勃将拥有与该电子邮件地址关联的用户ID不同的用户ID,因此无法访问付款记录。但是,如果Alice进行了两次付款却没有在第一次付款后验证她的电子邮件,就会中断。解决此问题的可靠方法是什么?
答案 0 :(得分:0)
请考虑在处理交易之前验证电子邮件。 一种选择是使用sign in with email link。这将登录用户并验证其电子邮件。如果需要,您也可以在之后设置密码。如果现有未验证的提供程序已链接到该帐户,则它将取消链接,并且恶意用户以前建立的任何现有会话都将被撤消。