要自動驗證電話號碼,您必須同時實現驗證流程的客戶端和服務器部分。本文檔介紹瞭如何實現服務器部分。
電話驗證服務器負責三個任務:
- 構造包含一次性代碼並具有客戶端SMS Retriever API期望格式的驗證消息
- 將驗證消息發送到用戶的設備
- 驗證一次性代碼發送回服務器後,並完成後端所需的所有驗證後任務
您的應用如何與服務器交互的具體方式取決於您。一種常見的方法是公開具有兩個端點的REST API:一個端點接收驗證給定電話號碼的請求並發送SMS驗證消息,第二個端點從應用程序接收一次性代碼。
1.構造驗證消息
當服務器收到驗證電話號碼的請求時,請首先構造驗證消息,然後將其發送到用戶的設備。此消息必須:
- 不能超過140個字節
- 包含一個一次性代碼,客戶端將其發送回您的服務器以完成驗證流程(請參閱生成一次性代碼)
- 包含一個11個字符的哈希字符串來標識您的應用(請參閱計算應用的哈希字符串)
否則,驗證消息的內容可以是您選擇的任何內容。創建一條消息很有用,以後您可以從中輕鬆提取一次性代碼。例如,有效的驗證消息可能如下所示:
Your ExampleApp code is: 123ABC78FA+9qCX9VSu
生成一次性代碼
您可以通過多種方式實施一次性代碼,只要這些代碼難以猜測即可,並且可以在客戶端應用將其發送回服務器時將代碼鏈接到用戶或電話號碼。您應該使代碼易於鍵入,以適應可能需要用戶手動鍵入代碼的任何情況。
實現一次性代碼的一種方法是生成隨機數,將其用作數據庫表中的鍵。例如,您可能有一個PendingVerifications表,如下所示:
ID | 用戶 | 期滿 |
---|---|---|
123456789 ... | 1234 | 2017-3-14 1:59 |
您可以將base32編碼的ID用作一次性代碼。
計算應用程序的哈希字符串
Google Play服務使用哈希字符串來確定將哪些驗證消息發送到您的應用。哈希字符串由您的應用程序的程序包名稱和應用程序的公鑰證書組成。生成哈希字符串:
如果您通過Google Play使用應用程序簽名,請從Google Play控制台的“應用程序簽名”部分下載應用程序簽名證書(
deployment_cert.der
)。然後,將應用程序簽名證書導入到臨時密鑰存儲區:
keytool -importcert -file deployment_cert.der -keystore temporary.keystore -alias PlayDeploymentCert
如果您直接簽署APK,請跳過此步驟。
獲取您的應用程序簽名證書(小寫的十六進製字符串),該證書可以是您在上方導入的證書,也可以是用來直接對APK進行簽名的證書。
例如,要從上面創建的臨時密鑰庫中獲取十六進製字符串,請鍵入以下命令:
keytool -exportcert -keystore temporary.keystore -alias PlayDeploymentCert | xxd -p | tr -d "[:space:]"
如果您直接簽署APK,請指定生產密鑰庫和證書別名。
如果創建了臨時密鑰庫,請將其刪除。
將十六進製字符串附加到應用程序的程序包名稱,並用一個空格分隔。
計算組合字符串的SHA-256和。在計算SHA-256和之前,請確保從字符串中刪除任何前導或尾隨空格。
Base64編碼SHA-256和的二進制值。您可能需要首先從其輸出格式中解碼SHA-256和。
您應用的哈希字符串是base64編碼的哈希的前11個字符。
以下命令從您應用的生產密鑰庫中計算哈希字符串:
keytool -exportcert -alias PlayDeploymentCert -keystore MyProductionKeys.keystore | xxd -p | tr -d "[:space:]" | echo -n com.example.myapp `cat` | sha256sum | tr -d "[:space:]-" | xxd -r -p | base64 | cut -c1-11
或者,您可以從SMS檢索器示例應用程序中的AppSignatureHelper類獲取應用程序的哈希字符串。但是,如果使用helper類,請確保在獲取哈希字符串後將其從應用程序中刪除。不要在驗證消息中使用在客戶端上動態計算的哈希字符串。
2.通過短信發送驗證信息
構造驗證消息後,請使用任何SMS系統將該消息發送到用戶的電話號碼。
例如,請參閱Twilio的開發人員網站上的使用Twilio SMS進行的應用程序驗證。
當用戶的設備收到此消息時,該消息將定向到您的應用程序。您的應用將提取一次性代碼,並將其發送回服務器以完成驗證過程。
3.驗證一次返回的代碼
電話號碼驗證服務器通常具有第二個終結點,該終結點用於從客戶端應用接收回一次代碼。當服務器在此終結點從您的應用程序收到一次性代碼時,請執行以下操作:
- 驗證一次性代碼有效且尚未過期。
- 記錄鏈接到一次性代碼的用戶已完成電話號碼驗證。
- 刪除一次性代碼的數據庫記錄,或以其他方式確保不再使用同一代碼。
當您記錄用戶的驗證狀態並從數據庫中刪除一次性代碼時,驗證就完成了。