Firebase:当用户可以使用虚假地址时通过电子邮件地址保护记录
Firebase: Securing records by email address when users can use fake addresses
我正在制作一个网络应用程序,您先付费使用它,然后再登录。注册工作流程是这样的:
在我的网站上完成付款后,客户会收到与其电子邮件地址关联的订单 ID。客户端将其发送到 Firebase 函数端点以激活他们的订单。
Firebase 函数会检查订单 ID 是否有效,并使用随机长密码创建一个 Firebase 用户(以防止任何人登录),然后发送密码重置电子邮件。 "payment" 记录在 Firestore 中创建并与用户 ID 相关联。
用户按照密码重置电子邮件登录我的应用程序。如果 Firestore 包含与该用户 ID 关联的付款,则付费功能将被激活。
这一切似乎都很好,除了:
我无法控制的恶意用户 Bob 为不属于他的电子邮件 "x@example.com" 创建了一个用户,并使用 Firebase 客户端 SDK 登录。
然后爱丽丝为她的电子邮件"x@example.com"付款。
Bob 仍将处于登录状态,现在可以使用 Alice 付费购买的功能。
如何防止这种情况发生?
我的一个想法是,上面的 Firebase 函数可以检查用户 "x@example.com" 是否存在未验证的电子邮件地址,如果存在,它将 1) 删除该用户和 2) 再次为该电子邮件地址创建一个用户(创建一个新的唯一用户 ID)。 Bob 将拥有与电子邮件地址关联的用户 ID 不同的用户 ID,因此无法访问付款记录。然而,如果爱丽丝在第一次付款后没有验证她的电子邮件就进行了两次付款,这就会中断。解决这个问题的可靠方法是什么?
考虑在处理交易之前验证电子邮件。
一种选择是使用 sign in with email link。这将使用户登录并验证他们的电子邮件。如果需要,您也可以在之后设置密码。如果现有的未经验证的提供商链接到该帐户,它将被取消链接,并且恶意用户之前设置的任何现有会话都将被撤销。
我正在制作一个网络应用程序,您先付费使用它,然后再登录。注册工作流程是这样的:
在我的网站上完成付款后,客户会收到与其电子邮件地址关联的订单 ID。客户端将其发送到 Firebase 函数端点以激活他们的订单。
Firebase 函数会检查订单 ID 是否有效,并使用随机长密码创建一个 Firebase 用户(以防止任何人登录),然后发送密码重置电子邮件。 "payment" 记录在 Firestore 中创建并与用户 ID 相关联。
用户按照密码重置电子邮件登录我的应用程序。如果 Firestore 包含与该用户 ID 关联的付款,则付费功能将被激活。
这一切似乎都很好,除了:
我无法控制的恶意用户 Bob 为不属于他的电子邮件 "x@example.com" 创建了一个用户,并使用 Firebase 客户端 SDK 登录。
然后爱丽丝为她的电子邮件"x@example.com"付款。
Bob 仍将处于登录状态,现在可以使用 Alice 付费购买的功能。
如何防止这种情况发生?
我的一个想法是,上面的 Firebase 函数可以检查用户 "x@example.com" 是否存在未验证的电子邮件地址,如果存在,它将 1) 删除该用户和 2) 再次为该电子邮件地址创建一个用户(创建一个新的唯一用户 ID)。 Bob 将拥有与电子邮件地址关联的用户 ID 不同的用户 ID,因此无法访问付款记录。然而,如果爱丽丝在第一次付款后没有验证她的电子邮件就进行了两次付款,这就会中断。解决这个问题的可靠方法是什么?
考虑在处理交易之前验证电子邮件。 一种选择是使用 sign in with email link。这将使用户登录并验证他们的电子邮件。如果需要,您也可以在之后设置密码。如果现有的未经验证的提供商链接到该帐户,它将被取消链接,并且恶意用户之前设置的任何现有会话都将被撤销。