核心要點
確認用戶身份的方法多種多樣:參考用戶自身的一些方面(例如生物識別技術),詢問用戶知道的內容(例如密碼),或詢問用戶實際擁有的東西(例如 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 文檔來了解更多關於子帳戶的信息。
<code class="language-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;</code>
account 實例公開了其他幾個屬性,其中包括 calls 和 sms_messages。這些是諸如 Services_Twilio_Rest_Calls 和 Services_Twilio_Rest_SmsMessages 之類的對象的實例,它們封裝了分別用於發出您的呼叫和消息的 REST 資源。但是,您很少在 create() 方法之外使用這些對象,並且文檔將公開它們的屬性稱為“實例資源”。我將做同樣的事情以幫助避免任何混淆。
發送短信
發送短信是通過 SMS 消息實例資源 ($acct->sms_messages) 的 create() 方法完成的。該方法接受三個參數:您帳戶的Twilio 號碼(類似於電子郵件的“發件人地址”)、收件人的號碼(“收件人地址”)以及您的消息文本(最多可達160 個字符)。
<code class="language-php"><?php $code = "1234"; // some random auth code $msg = $acct->sms_messages->create( "+19585550199", // "from" number "+19588675309", // "to" number "Your access code is " . $code );</code>
在幕後,twilio-php 庫代表您向 Twilio API 發出一些 TwiML 的 POST 請求。 Services_Twilio_Rest_SmsMessage 的一個實例由調用返回,該實例封裝了有關消息的信息。您可以在文檔中查看提供哪些信息的完整列表,但可能更重要的值是由 status 和 price 屬性公開的。 status 顯示短信的狀態(排隊、發送中、已發送或失敗),而 price 顯示為您的帳戶收取的消息金額。
發送語音呼叫
發起語音呼叫是通過 Calls 實例資源 ($acct->calls) 的 create() 方法完成的。與發送短信一樣,您需要提供您的帳戶號碼、收件人的號碼和消息。但是,在這種情況下,消息是描述呼叫性質的 TwiML 文檔的 URL。
<code class="language-php"><?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) );</code>
庫再次代表您發出 POST 請求,並進行語音呼叫。當被叫者接聽電話時,Twilio 的流程將檢索並執行回調 URL 的 XML 中提供的命令。在上面啟動語音呼叫的示例中,我已經將確認代碼作為 GET 參數傳遞到回調腳本的 URL 中。當 Twilio 檢索 URL 時,PHP 將在呈現響應時使用該參數。構建呼叫流程只需要少量 TwiML 標籤,但您可以使用它們來定義相當複雜的流程(例如電話樹菜單等)。但是,此類場景的基本呼叫流程可以由 PHP 生成,如下所示:
<code class="language-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;</code>
這裡使用的 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 和語音交互的基本工作流程,那麼現在該看看它如何適應登錄流程了。您在這裡看到的內容非常簡單明了,為了清晰起見,我已經減少了附帶代碼,因為您自己的登錄流程的細節必然會有所不同。應該向用戶顯示一個啟動流程的登錄表單。表單提交會導致您驗證其憑據並拒絕無效的憑據,但有效的憑據不應立即將用戶身份驗證到您的應用程序。相反,將用戶視為“部分已驗證”,這是一種狀態,允許她查看請求已發送到其手機的代碼的第二個表單。只有在她提交正確的代碼後,才應授權用戶。
<code class="language-php"><?php $code = "1234"; // some random auth code $msg = $acct->sms_messages->create( "+19585550199", // "from" number "+19588675309", // "to" number "Your access code is " . $code );</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中文網其他相關文章!