前言:
現(xiàn)如今登錄用手機(jī)驗證碼登錄是越來越常見了。雖然會增加成本,不過對用戶體驗的提升還是很有幫助的。那么,當(dāng)產(chǎn)品經(jīng)理對開發(fā)說,來按照這個原型給我搞個短信驗證碼登錄的時候。我們作為研發(fā),應(yīng)該想些什么?

短信登錄要做的事情

這里的圖只展示了一次成功的流程。還有很多細(xì)節(jié)值得展開講下。除了短信驗證的流程以外,登錄的安全性也必須要考慮到。尤其是比較重要的后臺項目。
下面我就想圖中17個步驟拆開分析
請求獲取驗證碼(1~4)
1~4步主要的點有兩個。
- 前端對手機(jī)號的格式驗證,按鈕多次點擊的驗證
驗證規(guī)則可以寬松一點。雖然前端的驗證并不可靠,但是不代表前端的驗證沒有用。同時,當(dāng)點擊了獲取驗證碼后需要將驗證碼的按鈕禁用,防止多次點擊 -
后端對請求驗證碼的頻率的限制
請求驗證碼頻率限制
后端的部分則需要判斷當(dāng)前ip,當(dāng)前手機(jī)號是否是重復(fù)請求驗證碼。這里就需要引入重復(fù)請求驗證碼的規(guī)則。一般的規(guī)則是60秒內(nèi)可以再次請求。這個時間可以通過記錄一條鍵名為請求手機(jī)號的一條緩存,過期時間為60秒。如果可以拿到值,則說明還沒有到60秒再次請求。
驗證合法性(5~8)
5~8步主要是驗證手機(jī)號背后的用戶的合法性
首先手機(jī)號的格式是必須要判斷的,雖然前端有判斷。但是后端的驗證才是可靠的驗證。后面就是通過手機(jī)號查庫。查詢的邏輯主要為
- 注冊用戶中是否有這個手機(jī)號
- 該用戶狀態(tài)是否為禁用
-
該用戶權(quán)限是否可以登錄當(dāng)前業(yè)務(wù)
驗證合法性
如果條件滿足就可以進(jìn)行下一步了
制作/存儲驗證碼(9~10)
制作驗證碼,就必須考慮兩個問題,1是驗證碼的長度 2是驗證碼的復(fù)雜度
對用戶最友好的當(dāng)然是純數(shù)字,驗證碼越短越好。但是這樣對安全性就大打折扣。有沒有又對用戶友好,又安全的方案呢?
答案是有的。我們先按照4位數(shù)字的方案制作,安全性的解決方案,在驗證的部分來分享

發(fā)送驗證碼給用戶(11~12)
這步就比較簡單了。只需要按照SMS的接口文檔,傳入手機(jī)號,短信模版,驗證碼就可以發(fā)送了??梢钥紤]增加一個日志記入數(shù)據(jù)庫,用作數(shù)據(jù)分析。
但是還有一個容易被忽略的問題。那就是短信防刷,我們之前的設(shè)置,都只是針對于一個手機(jī)號的防刷。還有一種刷短信是不停的更換手機(jī)號來刷的那種。解決方案可以通過,ip,ua,referer,header等參數(shù)來判斷是否是同一個客戶端發(fā)起的請求。如果是同一個客戶端在一個小時內(nèi)請求超過了5次。就必須通過極驗,或者輸入圖形碼。這樣的話可以最大限度的防止別人對我們的系統(tǒng)進(jìn)行攻擊,同時也保障了體驗不打折扣

驗證登錄,登錄成功(15~17)

上面提到我們選擇使用4位數(shù)字的驗證碼,如果不設(shè)置嘗試次數(shù)的限制的話,黑客使用多線程工具,在短時間內(nèi)進(jìn)行暴力請求,最多1萬次就能窮舉出所有的可能,而且運氣也不一定會這么差。有可能在3000次的時候就試出來了。
那么我們的解決方案就是。同一個手機(jī)號,驗證三次。就將驗證碼失效。在3次失敗后,第四次請求,就返回錯誤文案 “驗證碼連續(xù)錯誤三次,請重新獲取短信驗證碼”
還有一個需要思考的維度。那就是短信驗證碼的有效期。一般來說,短信驗證碼會有5分鐘的有效期。這里就會有一個交叉的問題。比如一個用戶獲取到了一個驗證碼而不去驗證,過了60秒又去獲取一次。他就會有兩個有效的驗證碼。這樣明顯是不合理的,那么我就需要在獲取第二次驗證碼的時候廢棄調(diào)第一個驗證碼。使用緩存存儲驗證碼的時候,直接set就可以將上一個驗證碼給覆蓋掉,還可以重新設(shè)置5分鐘的有效期。
驗證登錄這步主要是要完成之前提到的。驗證3失敗3次廢棄驗證碼(無論是否匹配),驗證通過后也要廢棄驗該驗證碼。同時驗證碼通過之后還是需要再次驗證用戶的合法性。防止比較極端的情況,比如請求驗證碼的時候用戶是合法的,但是在5分鐘之內(nèi)用戶被禁用了。這樣的話還是不能讓他登錄。
登錄成功的話就看自己的架構(gòu)設(shè)計了??梢允莟oken令牌也可以是session會話。建立會話之后,就算完成了一次完整的短信驗證碼登錄了!~
總結(jié)

總結(jié)完成之后,就可以按照要求進(jìn)行開發(fā)了。雖然是一個簡單的短信驗證碼,但是我發(fā)現(xiàn)市面很多的項目,這一塊都沒有做好(別問我,我怎么知道)我們作為研發(fā)人員,一定要盡可能的考慮周全,以免出現(xiàn)線上事故。

