简单实用的邮件任务 ,验证码、激活链接如何实现注册
大家肯定遇到过很多下面的场景,当你在某个网站、某个APP注册信息的时候,为了验证身份,需要填写你的邮箱地址,之后邮箱可能会收到验证码,也可能会收到一个里面有激活链接的邮件,叫你点击链接进行激活。
就像下面这样:
这两种方式是登录注册时对邮件任务的经典应用场景。
那么今天就继续上次整合登录的讲解,人脸识别和三方登录,往期的文章已经介绍了,有兴趣的回头再去看看。
邮件任务
SpringBoot已经为我们整合了对发送邮件的支持,也就是说我们可以使用代码,很方便的给指定的邮箱发送任意内容的邮件。
整合步骤
引入邮件任务依赖
在SpringBoot的配置文件中配置邮件信息(以QQ邮箱为例)
username:发送方邮箱,也就是你的邮箱地址
password:SMTP服务密码,并不是你的QQ密码
spring.mail.password通过下面方法获得
封装邮件服务类
邮件验证码的实现思路
操作步骤大家肯定都知道,输入完邮箱地址点击获取验证码后,按钮变成了disable状态,并且开始倒计时一分钟。
如此同时向后端发送异步请求,调用刚才写的邮件服务向输入的邮箱发送验证码。
发送完成后,将验证码与邮箱缓存,这里可以使用session或者redis。
用户收到验证码后,填写后点击登录,后端服务开始进行一些列的校验工作,比如:缓存中是否存在此邮箱?验证码是否正确?验证码是否过期?诸如此类的操作。校验没问题,那么就可以进行入库保存等操作了。
邮件激活链接实现思路
那么激活链接是如何实现的呢?首先既然叫激活,那么说明用户的信息肯定是已经存入数据库了,只不过用户的状态是尚未激活,所以无法正常使用系统。那么点击激活链接,其实主要目的就是把用户的状态修改为正常,大家首先要明白这一点。
当用户注册完成后,默认状态为【未激活】,在入库之后,后端就需要给注册邮箱发送激活链接,那么激活链接如何设计呢?我给大家提供两个思路:
思路一
生成一串随机字符串叫做密钥,因为用户信息已经存库,所以用户ID我们也是可以获取到,之后将密钥和用户id缓存,同样可以使用session或者redis。
之后将密钥和用户id拼接成URL的参数,像下面这样:
注意在激活链接中访问的是activate
请求,路径传参数输入get方式,所以后端服务需要在controller中编写此服务用于激活用户。
发送邮件的内容就可以是下面这样:
点击此链接进行激活: <a href="http://localhost:8080/activate?uid=1&key=asjkdjflksdajflasdfjdlsfj">点我激活</a>
收到的邮件如下:
思路二
和上面的区别主要在激活链接这块的设计,上面的可以实现,但是安全性和时效性上并不是很灵活和安全,所以我更推荐大家使用JWT Token的方式去作为激活链接的加密参数。
Token里面可以用来存放一些数据,并且可以很方便的设置Token的过期时间,这样我们在做校验的时候也会方便很多了。
所谓的JWT Token,也还是一串字符串,但是是混乱的,像下面这样:
eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImNpbmNvIiwicm9sZSI6ImFkbWluIiwic3ViIjoiYWRtaW4tdGVzdCIsImV4cCI6MTY0MjE0MDUyMCwianRpIjoiNDc0ZWRhNjUtYzI0Ny00OTg1LTgwNGEtMjM5NjliZjFhNDRhIn0.cRDXDjBmCMfgLCxNPINh_KBeKDPG-VNSA2LY95ySsmc