核心要点
确认用户身份的方法多种多样:参考用户自身的一些方面(例如生物识别技术),询问用户知道的内容(例如密码),或询问用户实际拥有的东西(例如 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 进行多因素身份验证 (MFA) 非常安全。它通过要求用户在访问其帐户之前提供至少两种身份验证方式来增加额外的安全层。第一种形式通常是密码,第二种形式可以是通过短信发送到用户手机的代码。即使他们拥有密码,这也使得未经授权的用户更难以访问帐户。
是的,您可以自定义身份验证流程以满足您的需求。Twilio 的 API 非常灵活,允许您根据您的特定要求调整身份验证流程。您可以选择第二因素的类型(例如短信、语音呼叫或电子邮件)、消息内容等等。
Twilio 是一个可靠的发送身份验证代码的平台。它拥有强大的基础设施并提供高交付率。它还提供实时交付报告,因此您可以跟踪消息的状态。
如果用户丢失了手机,他们仍然可以使用备用代码访问其帐户。这些代码是在设置 MFA 时生成的,应保存在安全的地方。用户可以输入这些代码而不是发送到其手机的代码。
是的,您可以将 MFA 与 PHP 和 Twilio 一起用于大型应用程序。Twilio 的基础设施旨在处理大量消息,使其适用于拥有大量用户的应用程序。
您可以通过创建一个测试帐户并完成身份验证流程来测试 MFA 实现。Twilio 还提供了一个沙盒环境,您可以在其中测试代码而无需发送实际消息。
虽然可以使用某些 MFA 解决方案进行不编码,但使用 PHP 和 Twilio 实现 MFA 需要一些编码知识。但是,该过程很简单,并且有很多资源可以帮助您。
使用 Twilio 进行 MFA 的费用取决于您发送的消息数量。Twilio 按消息收费,因此您发送的消息越多,费用越高。但是,Twilio 提供具有竞争力的价格和批量折扣。
是的,您可以将 MFA 与 PHP 和 Twilio 一起用于非 Web 应用程序。您可以在任何可以发送 HTTP 请求并处理 HTTP 响应的应用程序中实现 MFA。
除了 MFA 之外,Twilio 还提供一系列通信服务,包括语音、视频、聊天和电子邮件。这些服务可用于构建各种应用程序,从客户服务系统到营销自动化工具。
以上是PHP主|具有PHP和Twilio的多因素身份验证的详细内容。更多信息请关注PHP中文网其他相关文章!