驗證碼實現邏輯設計
阿新 • • 發佈:2018-11-26
背景說明
驗證碼可能會用在註冊、登陸、找回密碼等多個功能上。
可能會使用手機驗證碼或者郵箱驗證碼等多種方式。
這裡記錄一下自己的驗證碼實現方式。
解決方案
步驟一:傳送驗證碼
客戶端呼叫傳送驗證碼api
傳入欄位
欄位 |
型別 |
描述 |
String |
郵箱 |
|
mobile |
String |
手機號 |
type |
String |
目的服務. 允許值: "login" , "resetPassword" |
Api收到請求後
需要先檢查一下發送記錄,看看是否能夠傳送驗證碼:
1檢查驗證碼最小發送間隔
2檢查驗證碼今日已傳送次數
接著進行傳送記錄:
1重新整理最後傳送時間
2遞增今日傳送次數
然後是儲存驗證碼資訊
結構是這樣的
{ “addr”:”[email protected]”,//郵箱或手機號 “code”:”985764”,//驗證碼 “type”:”login”,//目的服務 “sendTime”:1509721130,//驗證碼傳送時間戳 “activeMinute”:10//驗證碼有效時間 }
直接存到快取中,根據activeMinute加上過期時間即可。
最後傳送時間以及今日傳送次數也都可以放在快取中。
最後將驗證碼的實際傳送交給佇列處理。傳送出去的驗證碼簡訊或者郵件,可以根據type欄位,說明該驗證碼用於什麼業務上。
步驟二:驗證驗證碼並獲取服務令牌
使用者輸入驗證碼後
客戶端呼叫驗證驗證碼api
傳入欄位
欄位 |
型別 |
描述 |
addr |
String |
使用者地址(郵箱或手機號). |
code |
Number |
手機驗證碼. |
接到呼叫後
後端先根據addr找到剛才驗證碼資訊
驗證驗證碼是否正確
如果驗證碼正確則生成令牌
令牌的實體
{
“addr”:”[email protected]”,//郵箱或手機號
“type”:”login”,//目的服務
“time”:1509721160,//令牌的生成時間戳,與上一步的不同
“activeMinute”:10//令牌的有效時間,與上一步的不同
}
轉換成字串後,使用金鑰加密(防止使用者篡改令牌,金鑰不能公開),得到令牌字串並返回給客戶端。
步驟三:在具體需要驗證碼的業務中,驗證令牌
比如在實際的註冊時
呼叫註冊api時,附加傳入上一步得到的令牌
後端使用金鑰解密令牌後得到,檢查令牌中的地址是否就是註冊時填的地址,檢查令牌中的目的服務是不是就是註冊服務,檢查令牌是否還有效。
如果令牌有效才執行實際的註冊步驟。