通過郵箱找回密碼

發送郵件→連接郵件裏的URL→修改密碼

重點就是如何生成這個url和如何解析這個url.

需要注意的是一個url只能修改一次密碼,當同一帳號發送多封郵件,只有最後一封郵件的url 是有效的

初步想法這個url有3個參數:用戶名,過期時間,數字簽名.

數字簽名 = MD5(用戶名+'$'+過期時間+密鑰key)

解析這個url的時候先驗證數字簽名,再驗證過期時間。

這個方法的弊端在於如果誰知道密鑰key,就能修改任意用戶密碼。

爲了保證這個密鑰key的安全性,密鑰key在應用每次啓動的時候隨機生成。

,還剩一個問題,就是一個url只能修改一次密碼。

這樣的話就需要每次修改完這個密碼以後,給做一個標記(在內存中保存用戶名, 過期時間,數字簽名),然後現在每次解析url的時候先驗證簽名,

然後驗證該url是否修改過密碼,最後驗證過期時間。

內存裏的標記在超過過期時間以後是需要清除的。需要做一個定時任務一天清除以下內存裏的

過期標記。好象這樣就差不多拉。

然後開始開發,開發完以後本機跑的沒啥問題。

忽然發現一個問題,生產環境下是多個應用的集羣環境,這樣的話多個應用隨機生成的

密鑰key是不一樣的。

那這樣密鑰key的生成後,只有放到數據庫比較好拉。

最後的方案:

數字簽名 = MD5(用戶名+'$'+過期時間+密鑰key)

數據庫字段(用戶名(主鍵),密鑰key,過期時間)

url參數(用戶名,數字簽名)

密鑰key的生成:在每一個用戶找回密碼時候爲這個用戶生成一個密鑰key

然後生成過期時間,生成數字簽名,生成url,發送郵件.

saveOrUpdate(用戶名,密鑰key,過期時間)

解析url:首先根據用戶名從數據庫中查找出密鑰key和過期時間,沒有則表示該請求

是僞造的或者過期的,然後驗證簽名,驗證過期時間,都驗證通過,就可以修改密碼,

密碼修改完以後,刪除數據庫中的記錄。

還需要加一個定時任務,刪除數據庫中當前時間大於過期時間的記錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章