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

PHP主|具有PHP和Twilio的多因素身份验证

Feb 26, 2025 am 09:02 AM

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

热AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1419
52
Laravel 教程
1311
25
PHP教程
1262
29
C# 教程
1234
24
说明PHP中的不同错误类型(注意,警告,致命错误,解析错误)。 说明PHP中的不同错误类型(注意,警告,致命错误,解析错误)。 Apr 08, 2025 am 12:03 AM

PHP中有四种主要错误类型:1.Notice:最轻微,不会中断程序,如访问未定义变量;2.Warning:比Notice严重,不会终止程序,如包含不存在文件;3.FatalError:最严重,会终止程序,如调用不存在函数;4.ParseError:语法错误,会阻止程序执行,如忘记添加结束标签。

PHP和Python:比较两种流行的编程语言 PHP和Python:比较两种流行的编程语言 Apr 14, 2025 am 12:13 AM

PHP和Python各有优势,选择依据项目需求。1.PHP适合web开发,尤其快速开发和维护网站。2.Python适用于数据科学、机器学习和人工智能,语法简洁,适合初学者。

说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? 说明PHP中的安全密码散列(例如,password_hash,password_verify)。为什么不使用MD5或SHA1? Apr 17, 2025 am 12:06 AM

在PHP中,应使用password_hash和password_verify函数实现安全的密码哈希处理,不应使用MD5或SHA1。1)password_hash生成包含盐值的哈希,增强安全性。2)password_verify验证密码,通过比较哈希值确保安全。3)MD5和SHA1易受攻击且缺乏盐值,不适合现代密码安全。

PHP行动:现实世界中的示例和应用程序 PHP行动:现实世界中的示例和应用程序 Apr 14, 2025 am 12:19 AM

PHP在电子商务、内容管理系统和API开发中广泛应用。1)电子商务:用于购物车功能和支付处理。2)内容管理系统:用于动态内容生成和用户管理。3)API开发:用于RESTfulAPI开发和API安全性。通过性能优化和最佳实践,PHP应用的效率和可维护性得以提升。

什么是HTTP请求方法(获取,发布,放置,删除等),何时应该使用? 什么是HTTP请求方法(获取,发布,放置,删除等),何时应该使用? Apr 09, 2025 am 12:09 AM

HTTP请求方法包括GET、POST、PUT和DELETE,分别用于获取、提交、更新和删除资源。1.GET方法用于获取资源,适用于读取操作。2.POST方法用于提交数据,常用于创建新资源。3.PUT方法用于更新资源,适用于完整更新。4.DELETE方法用于删除资源,适用于删除操作。

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 10, 2025 am 09:37 AM

PHP通过$\_FILES变量处理文件上传,确保安全性的方法包括:1.检查上传错误,2.验证文件类型和大小,3.防止文件覆盖,4.移动文件到永久存储位置。

解释self ::,parent ::和static :: in php oop中的区别。 解释self ::,parent ::和static :: in php oop中的区别。 Apr 09, 2025 am 12:04 AM

在PHPOOP中,self::引用当前类,parent::引用父类,static::用于晚静态绑定。1.self::用于静态方法和常量调用,但不支持晚静态绑定。2.parent::用于子类调用父类方法,无法访问私有方法。3.static::支持晚静态绑定,适用于继承和多态,但可能影响代码可读性。

See all articles