用户邮箱验证明现思路

用户邮箱验证明现思路

最近在作个网站的后台,使用了JWT 实现了用户验证,并在这个基础上实现用户邮箱验证。对于 JWT 的原理,本文将不会涉及太多,若是你不是很懂 JWT,建议你弄懂了再看这篇文章。

JWT 实现用户登陆

在说邮箱验证以前,先简单讲下 JWT 是如何实现用户验证的。数据库

当用户登陆时,验证完用户名和密码后,将 uid(用户id)和 iat(该 JWT 建立时间) 放入到 playload 中,使用密钥生成签名,最后组成 JWT,发送给客户端。客户端把这个 token 存在 localStorage 或 cookies 中。cookie

客户端每次发起须要权限的请求,都会携带这个 jwtToken。后台对 jwtToken 进行校验,发现没问题,则取出 jwt 的 payload 里的内容(注意 jwt 的一个优势是不须要数据库)。经过计算 iat 的时间加上后台设置的有效期是否大于当前时间来判断 token 是否过时,没过时就把 uid 保存在请求对象中。若是 token 没经过验证,则没法继续后面须要权限的操做。网站

添加邮箱验证功能

场景

用户注册帐户(填写用户名、密码、邮箱)后,会发送一封邮件给用户的邮箱。邮件里面有个连接,用户点击后,邮箱就被验证了。用户若是没有进行验证的话,是不容许一些操做的,如发表文章(防止恶意注册用户)。ui

流程图

图片描述

实现

下面就开始介绍实现过程。spa

首先,用户第一次注册的时候,在 user 表中建立了用户信息后,给客户端返回一个前面说到的 jwtToken。但这个 jwt 的 payload 要添加多一个属性 unAuthEmail,并设置为 true, 说明当前用户没有进行邮箱验证。code

与此同时咱们还要将生成的 用户id 存储到要给一个名为 unAuthEmailUser(没有进行邮箱验证的用户表) 的表中。jwt

unAuthEmailUser 表主要是记录没有进行邮箱验证的用户id,固然你也能够在 user 表中加个表字段来记录,不过我考虑到不进行邮箱验证的用户不会太多,就独立出这个个表了(以为大概能提高查表速度)。对象

对于邮箱验证,咱们也须要一个 token(为了和前面的验证用户token进行区分,咱们在这里将它称为 emailToken)。这里我也使用了 jwt 的方式,密钥能够用和前面相同的,也能够用新的。payload 部分,须要放置 uid 和 iat。生成 emailToken 后,将它做为 验证链接的 token 的值。如blog

https://yoursite.com/emailVerification?token=2f1f4cee1f0.c94560a75cc3b.6347f45ab

而后后台会将发送一封邮件给用户的邮箱(须要查询 user 表得到邮箱地址),里面附有这个邮箱验证连接。token

用户点击这个连接,就向 /emailVerification 路由传递了一个 token 参数。若是 Emailtoken 经过了验证,且没有过时(此次设置的过时时间要短点),将 unAuthEmailUser 含有对应 uid 的数据删除。这时候生成一个新的不含 unAuthEmail 的用户验证用的 Token 发送给客户端(代表当前用户已经进行过邮箱验证了)

用户每次登录生成 token 的时候,都要查询 unAuthMailUser 表,若是有该用户,返回的 token 中须要有 unAuthMail=true,不然不带该属性。

另外,用户还能够经过点击 “发送邮箱验证邮件” 按钮,生成 emailToken 发到你的邮箱。

总结

用户验证 token 和邮箱 token 都使用了 JWT。咱们建立了一个表来保存未进行邮箱验证的,用户每次生成用户身份验证用的 token 都要查询这个表。若是表中包含当前用户id,说明未进行邮箱验证,token 须要添加 unAuthMail: true;不然不添加这个属性。点击验证连接进行验证时,若是 token 有效,移除 unAutnMailUser 表中的对应用户id,并生成一个新的不含 unAuthMail 的 token 替换掉原来客户端保存的旧 token。

相关文章
相关标签/搜索