1. 程式人生 > >驗證碼實現邏輯設計

驗證碼實現邏輯設計

背景說明

驗證碼可能會用在註冊、登陸、找回密碼等多個功能上。

可能會使用手機驗證碼或者郵箱驗證碼等多種方式。

這裡記錄一下自己的驗證碼實現方式。

解決方案

步驟一:傳送驗證碼

客戶端呼叫傳送驗證碼api

傳入欄位

欄位

型別

描述

email

String

郵箱

mobile

String

手機號

type

String

目的服務.

允許值"register"

"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時,附加傳入上一步得到的令牌

後端使用金鑰解密令牌後得到,檢查令牌中的地址是否就是註冊時填的地址,檢查令牌中的目的服務是不是就是註冊服務,檢查令牌是否還有效。

如果令牌有效才執行實際的註冊步驟。