搜索
首页后端开发php教程PHP主|具有PHP和Twilio的多因素身份验证

PHP Master | Multi-Factor Authentication with PHP and Twilio

核心要点

  • 多因素身份验证 (MFA) 至少需要两种不同的验证方式,比传统的单因素身份验证安全得多。一种实用的 MFA 方法是要求用户提供密码和通过短信或语音呼叫发送到其手机的确认令牌。
  • Twilio 提供了基础设施和 API,开发人员可以使用它们来编写交互式电话应用程序,包括多因素身份验证系统。开发人员可以使用 TwiML(Twilio 标记语言)和其 REST API 通过 Twilio 进行拨打和接听电话以及发送和接收短信。
  • 使用 Twilio 实现多因素身份验证涉及创建 Services_Twilio 类的新实例,通过 account 属性访问其 API,并通过 SMS 消息实例资源或 Calls 实例资源的 create() 方法分别发送短信或发起语音呼叫。
  • 多因素身份验证流程包括向用户显示启动流程的登录表单,验证其凭据,将其代码发送到其手机,并在她提交正确的代码后才授权用户。此流程可以自定义,并增强诸如重新发送确认代码的链接、如果提供了错误的代码则锁定帐户以及身份验证事件的日志记录等功能。

确认用户身份的方法多种多样:参考用户自身的一些方面(例如生物识别技术),询问用户知道的内容(例如密码),或询问用户实际拥有的东西(例如 RFID 卡)。传统的网站实施单因素身份验证,只需要用户的密码。但另一方面,多因素身份验证至少需要两种不同的方法进行验证,并且安全得多。使用生物识别技术来验证某人对您网站的访问权限可能还有很长的路要走,还有许多技术障碍和公民自由问题需要克服。一种更实用的多因素身份验证方法是从其他两个类别中实现选项,例如要求密码和通过短信或语音呼叫发送到用户的确认令牌(用户知道密码,并且拥有手机)。这就是您将在本文中学习如何实现的内容。如果您从头开始进行电话集成,可能会令人沮丧,而且大多数情况下,构建自己的基础设施并不实用(尽管可以使用商品硬件和 Asterisk 等程序来实现)。幸运的是,Twilio 提供了基础设施和 API,开发人员可以使用它们轻松编写交互式电话应用程序。我将在本文中使用他们的服务。您可以使用 TwiML(Twilio 标记语言)和其 REST API 通过 Twilio 进行拨打和接听电话以及发送和接收短信。您可以直接使用 API,也可以使用可用的辅助库之一。我在这里将使用的库是 twilio-php,这是 Twilio 发布并正式支持的库。那么,您准备好学习如何实现多因素身份验证了吗?继续阅读!

使用 PHP 连接 Twilio

连接到 Twilio 服务就像包含 twilio-php 库和创建 Services_Twilio 类的新实例一样简单。该对象的构造函数接受您帐户的 SID 和身份验证令牌,这些令牌在您注册其服务后列在您的 Twilio 帐户的仪表板页面上。有了可用的 Services_Twilio 实例,您可以通过 account 属性访问其 API。account 公开了 Services_Twilio_Rest_Account 的一个实例,该实例代表您的 Twilio 帐户。我这里只使用一个帐户,但可以拥有多个子帐户。这对于根据您的需求细分您的交互可能很有用。您可以阅读 Twilio 文档来了解更多关于子帐户的信息。

<?php require "Services/Twilio.php";

define("TWILIO_SID", "…");
define("TWILIO_AUTH_TOKEN", "…");

$twilio = new Services_Twilio(TWILIO_SID, TWILIO_AUTH_TOKEN);
$acct = $twilio->account;

account 实例公开了其他几个属性,其中包括 calls 和 sms_messages。这些是诸如 Services_Twilio_Rest_Calls 和 Services_Twilio_Rest_SmsMessages 之类的对象的实例,它们封装了分别用于发出您的呼叫和消息的 REST 资源。但是,您很少在 create() 方法之外使用这些对象,并且文档将公开它们的属性称为“实例资源”。我将做同样的事情以帮助避免任何混淆。

发送短信

发送短信是通过 SMS 消息实例资源 ($acct->sms_messages) 的 create() 方法完成的。该方法接受三个参数:您帐户的 Twilio 号码(类似于电子邮件的“发件人地址”)、收件人的号码(“收件人地址”)以及您的消息文本(最多可达 160 个字符)。

<?php $code = "1234"; // some random auth code

$msg = $acct->sms_messages->create(
    "+19585550199", // "from" number
    "+19588675309", // "to" number
    "Your access code is " . $code
);

在幕后,twilio-php 库代表您向 Twilio API 发出一些 TwiML 的 POST 请求。Services_Twilio_Rest_SmsMessage 的一个实例由调用返回,该实例封装了有关消息的信息。您可以在文档中查看提供哪些信息的完整列表,但可能更重要的值是由 status 和 price 属性公开的。status 显示短信的状态(排队、发送中、已发送或失败),而 price 显示为您的帐户收取的消息金额。

发送语音呼叫

发起语音呼叫是通过 Calls 实例资源 ($acct->calls) 的 create() 方法完成的。与发送短信一样,您需要提供您的帐户号码、收件人的号码和消息。但是,在这种情况下,消息是描述呼叫性质的 TwiML 文档的 URL。

<?php // Note spaces between each letter in auth code. This forces
// the speech synthesizer to enunciate each digit.
$code = "1 2 3 4";

$msg = $acct->calls->create(
    "+19585550199", // "from" number
    "+19588675309", // "to" number
    "http://example.com/voiceCall.php?code=" . urlencode($code)
);

库再次代表您发出 POST 请求,并进行语音呼叫。当被叫者接听电话时,Twilio 的流程将检索并执行回调 URL 的 XML 中提供的命令。在上面启动语音呼叫的示例中,我已经将确认代码作为 GET 参数传递到回调脚本的 URL 中。当 Twilio 检索 URL 时,PHP 将在呈现响应时使用该参数。构建呼叫流程只需要少量 TwiML 标签,但您可以使用它们来定义相当复杂的流程(例如电话树菜单等)。但是,此类场景的基本呼叫流程可以由 PHP 生成,如下所示:

<?php require "Services/Twilio.php";

define("TWILIO_SID", "…");
define("TWILIO_AUTH_TOKEN", "…");

$twilio = new Services_Twilio(TWILIO_SID, TWILIO_AUTH_TOKEN);
$acct = $twilio->account;

这里使用的 TwiML 标签是 Response(根元素)、Say(提供 Twilio 将说的文本)和 Gather(收集用户的输入)。在说出 Say 子元素指示的文本时,由于 Gather,Twilio 还将侦听用户输入,并在之后暂停五秒钟,以便用户输入其响应。如果 Gather 在没有输入的情况下超时,它将退出并执行后续的 Say 文本并终止呼叫。否则,输入将通过 POST 发送回 action URL 以进行进一步处理。Gather 的 Twilio 文档非常擅长解释行为以及您可以用来修改行为的元素属性,甚至列出了几个示例。我建议您快速阅读一下。在继续之前,还有一件事需要注意;我已经在启动脚本中的 auth 代码中每个数字之间添加了空格。这会强制语音合成器逐个发音,说“one two three four”而不是“one thousand two hundred thirty four”。对于语音合成,有时我们在文本中看到的并不总是我们得到的。如果它能为您的被叫者带来更好的清晰度和理解,那么修改或拼错语音对话是可以的。

实现多因素身份验证

既然您已经了解了与 Twilio 进行 SMS 和语音交互的基本工作流程,那么现在该看看它如何适应登录流程了。您在这里看到的内容非常简单明了,为了清晰起见,我已经减少了附带代码,因为您自己的登录流程的细节必然会有所不同。应该向用户显示一个启动流程的登录表单。表单提交会导致您验证其凭据并拒绝无效的凭据,但有效的凭据不应立即将用户身份验证到您的应用程序。相反,将用户视为“部分已验证”,这是一种状态,允许她查看请求已发送到其手机的代码的第二个表单。只有在她提交正确的代码后,才应授权用户。

<?php $code = "1234"; // some random auth code

$msg = $acct->sms_messages->create(
    "+19585550199", // "from" number
    "+19588675309", // "to" number
    "Your access code is " . $code
);

上面的代码仅用于说明。在您的实际应用程序中,您可能需要考虑添加以下内容:

  • 添加一个链接以将确认代码重新发送到用户的手机。
  • 如果用户决定不继续该流程,请在代码请求表单上添加一个取消链接。关于上面的代码,这样的链接需要取消设置 $_SESSION["username"],因为该值除了存储用户名外,还充当 $_SESSION["isAuthenticated"] 的“部分身份验证”标志。
  • 如果提供了错误的代码,请添加节流或帐户锁定。
  • 根据您的偏执程度或您面临的合规性要求,将身份验证事件记录在某个位置。(需要多因素身份验证的应用程序通常足够敏感,需要审计跟踪!)

此外,您可能需要考虑为您的目的创建足够复杂的身份验证代码。4 位数字代码非常常见,但您并不局限于此。如果您选择使用字母或字母数字值的混合,我建议避免容易混淆的值(例如数字 0 与字母 O,数字 1 与字母 I 等)。

总结

经济实惠的移动设备和 IP 电话的普及增加了与用户交互的其他渠道,在本文中,您学习了一种通过使用“云通信”服务 Twilio 实现多因素身份验证来利用这些渠道的方法。我希望您发现本文有助于理解多因素身份验证和 Twilio。请随时在下面发表评论,分享您如何在自己的应用程序中使用 Twilio 或实现多因素身份验证。我很想听听您的想法!

(图片来自 Fotolia)

关于使用 PHP 和 Twilio 进行多因素身份验证的常见问题解答 (FAQ)

  • 使用 PHP 和 Twilio 进行多因素身份验证有多安全?

使用 PHP 和 Twilio 进行多因素身份验证 (MFA) 非常安全。它通过要求用户在访问其帐户之前提供至少两种身份验证方式来增加额外的安全层。第一种形式通常是密码,第二种形式可以是通过短信发送到用户手机的代码。即使他们拥有密码,这也使得未经授权的用户更难以访问帐户。

  • 我可以自定义身份验证流程吗?

是的,您可以自定义身份验证流程以满足您的需求。Twilio 的 API 非常灵活,允许您根据您的特定要求调整身份验证流程。您可以选择第二因素的类型(例如短信、语音呼叫或电子邮件)、消息内容等等。

  • Twilio 发送身份验证代码的可靠性如何?

Twilio 是一个可靠的发送身份验证代码的平台。它拥有强大的基础设施并提供高交付率。它还提供实时交付报告,因此您可以跟踪消息的状态。

  • 如果用户丢失了手机怎么办?

如果用户丢失了手机,他们仍然可以使用备用代码访问其帐户。这些代码是在设置 MFA 时生成的,应保存在安全的地方。用户可以输入这些代码而不是发送到其手机的代码。

  • 我可以将 MFA 与 PHP 和 Twilio 一起用于大型应用程序吗?

是的,您可以将 MFA 与 PHP 和 Twilio 一起用于大型应用程序。Twilio 的基础设施旨在处理大量消息,使其适用于拥有大量用户的应用程序。

  • 如何测试 MFA 实现?

您可以通过创建一个测试帐户并完成身份验证流程来测试 MFA 实现。Twilio 还提供了一个沙盒环境,您可以在其中测试代码而无需发送实际消息。

  • 是否可以在不进行编码的情况下实现 MFA?

虽然可以使用某些 MFA 解决方案进行不编码,但使用 PHP 和 Twilio 实现 MFA 需要一些编码知识。但是,该过程很简单,并且有很多资源可以帮助您。

  • 使用 Twilio 进行 MFA 的费用是多少?

使用 Twilio 进行 MFA 的费用取决于您发送的消息数量。Twilio 按消息收费,因此您发送的消息越多,费用越高。但是,Twilio 提供具有竞争力的价格和批量折扣。

  • 我可以将 MFA 与 PHP 和 Twilio 一起用于非 Web 应用程序吗?

是的,您可以将 MFA 与 PHP 和 Twilio 一起用于非 Web 应用程序。您可以在任何可以发送 HTTP 请求并处理 HTTP 响应的应用程序中实现 MFA。

  • Twilio 还提供哪些其他服务?

除了 MFA 之外,Twilio 还提供一系列通信服务,包括语音、视频、聊天和电子邮件。这些服务可用于构建各种应用程序,从客户服务系统到营销自动化工具。

以上是PHP主|具有PHP和Twilio的多因素身份验证的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
PHP与其他语言:比较PHP与其他语言:比较Apr 13, 2025 am 12:19 AM

PHP适合web开发,特别是在快速开发和处理动态内容方面表现出色,但不擅长数据科学和企业级应用。与Python相比,PHP在web开发中更具优势,但在数据科学领域不如Python;与Java相比,PHP在企业级应用中表现较差,但在web开发中更灵活;与JavaScript相比,PHP在后端开发中更简洁,但在前端开发中不如JavaScript。

PHP与Python:核心功能PHP与Python:核心功能Apr 13, 2025 am 12:16 AM

PHP和Python各有优势,适合不同场景。1.PHP适用于web开发,提供内置web服务器和丰富函数库。2.Python适合数据科学和机器学习,语法简洁且有强大标准库。选择时应根据项目需求决定。

PHP:网络开发的关键语言PHP:网络开发的关键语言Apr 13, 2025 am 12:08 AM

PHP是一种广泛应用于服务器端的脚本语言,特别适合web开发。1.PHP可以嵌入HTML,处理HTTP请求和响应,支持多种数据库。2.PHP用于生成动态网页内容,处理表单数据,访问数据库等,具有强大的社区支持和开源资源。3.PHP是解释型语言,执行过程包括词法分析、语法分析、编译和执行。4.PHP可以与MySQL结合用于用户注册系统等高级应用。5.调试PHP时,可使用error_reporting()和var_dump()等函数。6.优化PHP代码可通过缓存机制、优化数据库查询和使用内置函数。7

PHP:许多网站的基础PHP:许多网站的基础Apr 13, 2025 am 12:07 AM

PHP成为许多网站首选技术栈的原因包括其易用性、强大社区支持和广泛应用。1)易于学习和使用,适合初学者。2)拥有庞大的开发者社区,资源丰富。3)广泛应用于WordPress、Drupal等平台。4)与Web服务器紧密集成,简化开发部署。

超越炒作:评估当今PHP的角色超越炒作:评估当今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

PHP中的弱参考是什么?什么时候有用?PHP中的弱参考是什么?什么时候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

解释PHP中的__ Invoke Magic方法。解释PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

解释PHP 8.1中的纤维以进行并发。解释PHP 8.1中的纤维以进行并发。Apr 12, 2025 am 12:05 AM

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

MinGW - 适用于 Windows 的极简 GNU

MinGW - 适用于 Windows 的极简 GNU

这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。