找回密码功能设计
Posted lpz89
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了找回密码功能设计相关的知识,希望对你有一定的参考价值。
背景
一个大型网站平台,用户自主注册难免会有用户忘记密码,因此需要提供找回密码功能。
本方案是通过邮箱找回密码。
需要的表结构
找回密码表(FindPwdRecord):
字段名
类型
描述
备注
ID
string
主键
UserID
string
用户ID
UserName
string
用户名
Token
string
找回密码的凭证
通过随机算法生成的无重复字串
string
邮箱地址
CreateTime
Datetime
发起时间
ExpiryTime
Datetime
失效时间
IsExpiried
bit
状态
0正常,1已失效
设计思路
用户需要找回密码时向后台发送请求,当后台判断用户可以找回密码时生成一条记录插入到数据库中,并将凭证作为连接参数发送到邮箱。
客户点击修改密码连接时,后端首先验证凭证,以下几种情况判定凭证无效,
- 凭证不存在,提示用户非法操作
- 凭证已过期,提示用户重新发起找回密码的流程
- 凭证状态为已失效, 提示用户凭证已失效
如果凭证有效,提供重置密码的表格,用户填写新密码,和凭证一起提交到后端,后端首先验证凭证是否已失效(IsExpiried=1),如果没有被使用过(IsExpiried=0)则修改密码并将凭证的状态修改为已失效。此步验证避免并发。
整体流程
第一步,发起流程
用户点击找回密码连接,先提示用户填写用户名,并输入验证码,(如果有手机短信模块,这块可以发送验证码到预留手机)点击确定:
第二步,验证邮箱
验证验证码正确并且用户名存在,跳转到找回密码界面,部分显示用户的预留邮箱,如下:
第三步,发送重置密码的连接
用户填写完整邮箱后,点击确定,后端验证邮箱是否和预留邮箱一致,如果一致则执行如下操作:
- 生成一条FindPwdRecord记录插入到数据库,其中Token随机生成,UserID,UserName和Email字段取自用户信息,CreateTime是当前时间,ExpiryTime是链接失效时间(比如20分钟),
- 通过上一步的Token拼接一个重置密码的链接,
- 发送包含重置密码链接的邮件到目标邮箱中
- 提醒用户邮件已发送,通过邮件继续流程:
邮箱内容如下:
第四步,填写新密码
用户通过点击邮箱中的重置密码连接,后端验证token令牌,如果合法,则显示重置密码的表单,否则提示用户连接无效,重置密码页面如下:
重置密码的请求参数中需要包含重置密码的凭证Token,后端收到请求为了避免一个链接使用多次,仍然要验证token的有效性,
当Token有效了,重置用户的密码,并将找回密码记录(FindPwdRecord)的是否失效字段(IsExpiried)修改为1,。
第五步,重置密码成功
提示用户密码重置成功,并跳转登录页面:
以上是关于找回密码功能设计的主要内容,如果未能解决你的问题,请参考以下文章