1. 程式人生 > >找回密碼功能設計

找回密碼功能設計

分享 設計 顯示 失效 time 驗證 table width 後臺

背景

一個大型網站平臺,用戶自主註冊難免會有用戶忘記密碼,因此需要提供找回密碼功能。

本方案是通過郵箱找回密碼。

需要的表結構

找回密碼表(FindPwdRecord):

字段名

類型

描述

備註

ID

string

主鍵

UserID

string

用戶ID

UserName

string

用戶名

Token

string

找回密碼的憑證

通過隨機算法生成的無重復字串  

Email

string

郵箱地址

CreateTime

Datetime

發起時間

ExpiryTime

Datetime

失效時間

IsExpiried

bit

狀態

0正常,1已失效

設計思路

用戶需要找回密碼時向後臺發送請求,當後臺判斷用戶可以找回密碼時生成一條記錄插入到數據庫中,並將憑證作為連接參數發送到郵箱。

客戶點擊修改密碼連接時,後端首先驗證憑證,以下幾種情況判定憑證無效,

  • 憑證不存在,提示用戶非法操作
  • 憑證已過期,提示用戶重新發起找回密碼的流程
  • 憑證狀態為已失效, 提示用戶憑證已失效

如果憑證有效,提供重置密碼的表格,用戶填寫新密碼,和憑證一起提交到後端,後端首先驗證憑證是否已失效(IsExpiried=1),如果沒有被使用過(IsExpiried=0)則修改密碼並將憑證的狀態修改為已失效。此步驗證避免並發。

整體流程

第一步,發起流程

用戶點擊找回密碼連接,先提示用戶填寫用戶名,並輸入驗證碼,(如果有手機短信模塊,這塊可以發送驗證碼到預留手機)點擊確定:

技術分享圖片

第二步,驗證郵箱

驗證驗證碼正確並且用戶名存在,跳轉到找回密碼界面,部分顯示用戶的預留郵箱,如下:

技術分享圖片

第三步,發送重置密碼的連接

用戶填寫完整郵箱後,點擊確定,後端驗證郵箱是否和預留郵箱一致,如果一致則執行如下操作:

  1. 生成一條FindPwdRecord記錄插入到數據庫,其中Token隨機生成,UserID,UserName和Email字段取自用戶信息,CreateTime是當前時間,ExpiryTime是鏈接失效時間(比如20分鐘),
  2. 通過上一步的Token拼接一個重置密碼的鏈接,
  3. 發送包含重置密碼鏈接的郵件到目標郵箱中
  4. 提醒用戶郵件已發送,通過郵件繼續流程:

技術分享圖片

郵箱內容如下:

技術分享圖片

第四步,填寫新密碼

用戶通過點擊郵箱中的重置密碼連接,後端驗證token令牌,如果合法,則顯示重置密碼的表單,否則提示用戶連接無效,重置密碼頁面如下:

技術分享圖片


重置密碼的請求參數中需要包含重置密碼的憑證Token,後端收到請求為了避免一個鏈接使用多次,仍然要驗證token的有效性,

當Token有效了,重置用戶的密碼,並將找回密碼記錄(FindPwdRecord)的是否失效字段(IsExpiried)修改為1,。

第五步,重置密碼成功

提示用戶密碼重置成功,並跳轉登錄頁面:

技術分享圖片

找回密碼功能設計