OTP SMS (MFA/2FA) 的廉价替代品

问题描述

在我的 Android 应用程序中,我需要将用户的联系人链接到我们的数据库用户帐户,以便用户可以单击特定联系人,应用程序会将其转换为我们的内部用户 ID(如果存在),从而使沟通更容易和更友好。

我想过使用 SMS OTP 来验证电话号码(电话号码 -> 内部用户 ID),但结果证明它非常昂贵(估计每个月有 150k-300k 新用户)。我们的用户遍布全球。费用为每月 15,000 美元至 40,000 美元。不是我们买得起的。

也在考虑从以下位置获取用户的电话号码:

  • Google People API - 需要特殊权限,并且只提供未经验证的“关于我”电话号码。
  • Google Account API - 无法获取电话号码
  • Google 登录 SSO - 无法获取电话号码
  • Facebook 登录 SSO - 无法获取电话号码(已弃用)
  • WhatsApp 的 AccountKit(通过 WhatsApp 的 OTP)- 已弃用
  • WhatsApp API - 非常昂贵,在某些情况下与 SMS 相似,甚至更多
  • 从 SIM 卡中提取 - 不可靠,大多数情况下不起作用,未经验证,可以伪造

是否有比短信 OTP 更便宜的替代方法获取经过验证的电话号码?

谢谢!

解决方法

您可以使用一种廉价的 hack(免费)方法,但它可以被用户伪造,前提是用户可以控制输入的电话号码。

因此,只有当您对在某些情况下怀有恶意的高级用户感到满意时才应该使用它。

这里的想法是 SMS 发送的成本将转移到用户而不是您的服务器上。如今,在大多数国家/地区,一条 SMS 都是免费的,或者在其中一些国家/地区非常便宜,因此您应该提供“可能会收取运营商费用”等免责声明。

您需要根据 tutorial 实施 SMS Retriever API 流程,但是当它说要从您的服务器发送 SMS 时,您应该让用户从他们自己的设备发送该 SMS:

Intent intent = new Intent( Intent.ACTION_VIEW,Uri.parse( "sms:" + inputNumber)); 
                    intent.putExtra( "sms_body",otpContents); 
                    startActivity(intent);

或者,如果您的应用有权发送短信,则使用 SmsManager

短信检索器流程的其余部分应按照教程中的说明进行,允许您的应用验证用户输入的号码是否由用户发送和接收。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...