用SMS 2FA管理重试逻辑的最佳实践

205 阅读6分钟

你好,感谢你的阅读!这篇博文是对用SMS 2FA管理重试逻辑的最佳实践的翻译。在我们改进翻译流程的过程中,如果您发现有任何翻译错误的地方,我们将感谢您的反馈,help@twilio.com。感谢你对Twilio Swag的有益贡献 :)

人类是没有耐心的动物。在世界大部分地区,短信验证或双因素认证(2FA)可能很快就会被采用,但我们总是建议在验证工作流程中建立重试缓冲区。这可以防止以下情况:

  • 不小心用重复的短信向用户发送垃圾信息
  • 达到API速率限制
  • 费用欺诈或不必要的支出

虽然这篇文章中的最佳实践是针对Twilio Verify API而写的,但很多都适用于任何2FA供应商。结合其他最佳实践,如创建一个用于验证的国家代码批准列表,这些步骤可以帮助你的用户验证工作流程尽可能顺利地运行。

启动一个演示应用程序,采用短信重试的最佳做法。

这个项目也可以在Twilio CodeExchange上快速部署--不需要任何代码

我已经开发了一个应用程序,展示了本帖中描述的最佳实践。该应用之所以能快速启动,是因为它是使用Twilio Functions(Twilio的无服务器环境)构建的。你可以按照这些说明开始自己的工作。

要求包括:

  • Node.js
  • 一个免费的Twilio账户(你可以通过这个链接免费注册,并在升级账户时获得10美元的积分)。
  • 一个验证服务。在Twilio控制台创建一个。

克隆或下载我GitHub上的样本项目

git clone https://github.com/robinske/verify-retry.git && cd verify-retry

使用npm install 安装依赖项。然后重新命名 .env.example-file到.env (出于安全考虑,.env文件是.gitignore的一部分,不会传递到源文件中),并在变量中填入你在Twilio控制台找到的账户SID和auth token。输入你之前创建的验证服务SID

# find in the twilio console: https://twilio.com/console
ACCOUNT_SID=
AUTH_TOKEN=

# create one in the twilio console: https://twilio.com/console/verify/services
VERIFY_SERVICE_SID=

使用npm start 启动该项目,并导航到http://localhost:3000/index.html 进行测试。

重复短信2FA代码的最佳做法

在重新发送按钮中实施超时

在重试之间添加一个缓冲区,以防止不良行为或意外地发送多个代码。我们建议从30秒开始。

Ausgegraute Option zum erneuten Senden des Codes mit der Meldung „resend code in 22 seconds“

在演示中,我们从最大超时开始倒计时,让按钮失效,直到超时结束。如果想找一个动画较少的替代品,你可以:

  • 剩余5秒时显示倒计时
  • 禁用重传按钮,直到超时结束,并显示表明总缓冲区的文字(没有倒计时)。
  • 只在超时后显示重试链接

追踪重试

Verify API在响应中包括一个验证尝试的列表,你可以用它来增加每个后续尝试的重试缓冲区。你也可以使用尝试次数来执行你自己的速率限制,除了验证API速率限制(10分钟内有5次验证开始)。

在这个功能中,你可以看到一个用更多的尝试来增加超时的例子。这里的默认超时是最大的(10分钟),可以用来防止你的应用程序达到API速率限制:

function getRetryTimeout(attemptNumber) {
 const retryTimeouts = {
   1: 30,
   2: 40,
   3: 60,
   4: 90,
   5: 120,
 };

 return retryTimeouts[attemptNumber] || 600;
}

后备渠道的最佳实践

在第三次验证尝试时提供替代渠道,如语音

语音电话在电话网络上获得优先权,可以确保你的客户收到验证码。然而,语音通道可能被滥用于费用欺诈。因此,除非你认识一个固定电话,或者有一个打电话的商业案例,否则我们建议等到第三次或第四次尝试发送短信时再提供这个渠道,或者完全禁用它。

一旦发生多次短信尝试,为用户显示 "给我打电话 "选项。

Eingabefeld für Einmal-Sicherheitscode mit ausgegrauter Nachricht zum erneuten Versenden des Codes und anklickbarem Link mit der Meldung "having trouble receiving SMS, call me instead"

识别座机号码

除了使用Twilio的Lookup API来检测无效的电话号码,你还可以使用API来检测座机号码。对于这些号码,你可以使用call 频道,而不是短信。

如果你在示例项目中输入一个固定电话,它将自动打电话,验证码不会通过短信发送。

Eingabefeld für Einmal-Sicherheitscode mit der Meldung „landline detected. sent call verification“

在Twilio控制台禁用未使用的通道

如果你想完全禁用某些频道,你可以在Twilio控制台的验证部分这样做。

Twilio Verify-Konsole mit Umschaltflächen zur Deaktivierung von Anruf- und E-Mail-Kanälen

对语音电话实施reCAPTCHA

实施reCAPTCHA,在你的验证过程中检测和防止机器人。关于实现这一功能的更多信息,请参阅谷歌的开发者文档

增加额外的费率限制

Twilio Verify API支持可编程的费率限制,你可以根据请求,如IP地址、地理位置或国家代码,将其应用于特定的分段。

用户验证的一般最佳做法

重试逻辑是为用户验证创建一个无缝工作流程的一个组成部分。其他最佳做法包括:

1.使用Twilio的Lookup API,在发送验证前检测无效的号码和线路类型

除了使用运营商查询来识别座机号码外,在你试图发送验证码之前,还可以使用查询来识别无效的号码。

2. 创建一个允许或阻止的国家名单

签约时使用国家批准名单是确保你遵守法规、减少欺诈或以其他方式控制你的入职管道的一个好方法。

3. 显示完整的电话号码,用于初始用户验证

对于电话号码验证用例(相对于持续的登录认证或双因素认证),在用户界面上显示完整的电话号码,以帮助用户识别错别字。

Eingabefeld für Einmal-Sicherheitscode mit Meldung, die die vollständige Telefonnummer mit der Option zum Bearbeiten anzeigt.

4.为持续的登录认证或双因素认证屏蔽电话号码

在对电话号码进行初步核实后,在随后的使用中应掩盖该电话号码,以防止PII泄露。与上面的例子不同,没有办法编辑一个电话号码来进行持续认证。我们建议提供3或4个数字,并对其余的数字进行屏蔽,如+1 (5**) ***-**67********567

Eingabefeld für Einmal-Sicherheitscode mit Meldung, die die verborgene Telefonnummer ohne Option zum Bearbeiten anzeigt.

可选:用Twilio功能部署项目

要用Twilio功能部署这个项目,你需要:

安装完这些依赖项后,你可以在verify-retry 文件夹中运行以下命令来部署这个项目

twilo serverless:deploy

用户验证的下一步

根据可用隐私专家Miranda Wei的说法,我们应该考虑将可用安全设计成一种客户服务的形式,关注不断变化的安全问题。你不能只设置一次安全措施,然后就不关心它们了。这些最佳实践是一个良好的开端,但我们建议监测你的支持成本和用户满意度,以便你能在你的产品和认证技术的发展中提供最佳解决方案。