问题描述
要实现一个忘记密码的功能:点击忘记密码连接->进入新的页面->输入邮箱->点击确定后发邮件->点击邮件中的连接,进入新的页面->输入新的密码和确认密码->点击确定,重置密码成功后重新登录
矛盾点
老师提醒说这里需要一张表,但不知道这个表做什么
问题解决
Q1:虽然很清楚userJourney,但细节却不清楚,如:邮件中的链接应该长什么样?
A1:分析,首先,这个链接应该有两个特点:一是有效期,二是唯一性,两者都是安全性的考虑,防止可以随意在任何时候输入链接都可以随意修改密码。
Q2:如何保证上面两个特点?
A2:唯一性可以使用随机生成一段字符串uuID来保证,每一封邮件中这个字符串都是唯一的,并使用过以后都失效。有效期可以设置过期时间来保证,通过生成字符串的时间为开始时间,规定一段时间后连接失效,则该字符串也不能再使用。
Q3:生成的字符串uuId应该需要和填入密码后请求带来的uuid进行比较,那么uuid应该存在哪?
A3:表,这时自然而然的就想到了表,表中除存储uuid,还有什么了?uuid的生成时间,userId,是否过期的表示isvaild
Q4:表有了,如何根据这表设计API?
A4: 首先,我们需要两个api,一个需要往表中存数据并发邮件;另外一个需要需要去更新user表中的密码。
存数据发邮件的api
- 判断前端传来的email是够存在于user表中
- 如果存在,根据email找当前人的userId,不存在则说明用户填的email可能就是错的
- 根据userId来找重置密码表中数据.
- 如果数据存在,说明此用户可能不止一次的重置过密码,在一堆数据中找近距离当前时间最近的,判断当前时间和数据库的时间的差,时间限制内,提示已输入过名密码
- 如果数据不存在,证明此人是第一次重置密码,在重置密码表中save数据并发邮件
更新密码api:
- uuid的正确性判断,防止随便输入uuid进行更改
- 如果没有超过期限,更新密码,并将isVaild 置为1,说明uuId已经失效
- 若已超过期限,提示连接失效
反思
- 做的过程中要先写后端再写前端,设计好之后再开始写
- 邮件中的地址需要不同环境的url,url环境变量还没有解决
action
写代码之前要设计好,如:表结构,考虑清楚可能的异常情况,最后再开始写代码
网友评论