这节我们继续Go项目的实战开发,首先再看一下项目要实现的功能的用例图

图中用户认证相关的功能我们已经开发完了,在前面的四节课中详细地记述了他们的设计和开发过程,这一节我们行进到功能用例的第二大部分--用户个人信息管理。
前面两节我们还埋下了一个扣,说用户在修改密码后需要把用户在所有登录平台上的Token和Session全部清除掉,强制用户在每个平台上用新密码重新登录,这也是一项安全措施。那么这一节我们就先来开发用户密码的修改/重置,
重置密码的流程拆解和安全防护
用户在登录态下修改和重置密码比较好实现,很多产品的逻辑是登录情况下输入原密码、新密码就可以修改,而用户在无登录状态下做上面这些操作即找回密码的功能则需要通过让用户填写服务器发送给他们的验证码,进行确认后才能为用户修改密码。
我们这里就直接分析重置密码的功能吧,这个功能在逻辑实现上更完善一些,拿来做修改密码功能也能用。
重置密码的整个流程中服务端内部做了什么,和客户端怎么交互的,我用一张顺序图给大家做了梳理。大家先看一下:

每个产品重置用户密码的功能实现跟这里说的可能有细微差别,但总体流程应该差不多。
客户端首先发起申请重置密码的请求,请求中需要提交它的邮箱/手机号
服务端验证用户是否存在、是否为正常状态,然后生成重置密码的Token和六位验证码
以Token为Key,将用户的ID和验证码存储到Redis,用于后续重置密码时的安全验证,缓存设置一个较短的有效期,比如半小时过期
通过邮件/短信的形式把验证码发送给用户
返回重置密码的Token给客户端
重置密码操作:客户端提交用户输入的新密码和验证码,头部携带Token发起发起请求
服务端验证信息后,把用户密码设置为新密码,然后把用户在Redis中保存的Session清空,强制把用户的登录状态踢掉。
这里注意一点,因为咱们的Token体系是支持多登录平台的,这里重置完密码后我们需要拿到用户在所有平台上的Token和Session信息都清掉,强制用户重新登录。
服务端把申请密码重置时缓存的验证码Code和重置Token删掉,防止用户的重复请求和恶意用户。
通过上面顺序图中客户端与服务端交互的会话框,我们可以看到密码重置功能需要两个接口来完成:
申请重置密码
提交重置密码
那么接下来我带大家一起写一下这两个接口,用代码实现我们在上面UML顺序图中整理出来的逻辑。
首先我们来看申请重置密码接口。
申请重置密码
申请重置密码功能,第三方对接应该是一些邮件或者是SMS短信服务,这个需要企业服务,就直接Mock掉了,大家真正在公司里开发项目时,记住与邮件对接的逻辑要写到Library里。
在开始写代码前我们再默念一遍逻辑分层的口诀
请求验证和数据绑定逻辑 --- Controller
外围业务逻辑 --- 应用服务
核心业务逻辑 --- 领域服务
数据访问逻辑 --- 数据访问层
第三方对接 -- Library(这个本节暂时用不到)
申请重置密码时,我们在下发重置密码的Token和验证码前需要在Redis缓存一份,用于后面用户提交重置密码时的验证,所以我们先从DAL层的代码开始。
这些功能详尽的实现代码和效果测试都涵盖了《Go项目搭建和整洁开发实战》专栏中,现在扫码订阅专栏,一起加入学习吧

本专栏分为五大部分,重点章节如下
第一部分介绍让框架变得好用的诸多实战技巧,比如通过自定义日志门面让项目日志更简单易用、支持自动记录请求的追踪信息和程序位置信息、通过自定义Error在实现Go error接口的同时支持给给错误添加错误链,方便追溯错误源头。
第二部分:讲解项目分层架构的设计和划分业务模块的方法和标准,让你以后无论遇到什么项目都能按这套标准自己划分出模块和逻辑分层。后面几个部分均是该部分所讲内容的实践。
第三部分:设计实现一个套支持多平台登录,Token泄露检测、同平台多设备登录互踢功能的用户认证体系,这套用户认证体系既可以在你未来开发产品时直接应用
第四部分:商城app C端接口功能的实现,强化分层架构实现的讲解,这里还会讲解用责任链、策略和模版等设计模式去解决订单结算促销、支付方式支付场景等多种多样的实际问题。
第五部分:单元测试、项目Docker镜像、K8s部署和服务保障相关的一些基础内容和注意事项
扫描上方二维码或者访问 https://xiaobot.net/p/golang 即刻订阅
此外想更详细地了解专栏内容,或者希望专栏有优惠时能提前告知你,都可以添加下面我的微信
