用户邮箱验证实现思路

异步根系
• 阅读 12404

用户邮箱验证实现思路

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

JWT 实现用户登录

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

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

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

添加邮箱验证功能

场景

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

流程图

用户邮箱验证实现思路

实现

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

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

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

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

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

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

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

用户点击这个链接,就向 /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。

点赞
收藏
评论区
推荐文章
大猫猫酱 大猫猫酱
4年前
Go 语言开源社区系统 BBS-GO 3.2.6 发布,新增反作弊系统
更新内容支持开源中国一键登录反作弊系统发表内容验证码开关邮箱验证开关发表频率控制新用户观察期用户禁言...集成nuxtvite修复积分记录展示错误问题永久禁言用户积分清零发布地址github:https://github.com/mlogclub/bbsgo/releases/tag/v3.2.2gite
不是海碗 不是海碗
2年前
运营商二要素、三要素 API:为用户的个人信息安全保驾护航
本文将介绍运营商二要素、三要素API的技术原理、实际应用场景、以及如何使用API实现用户身份验证。
待兔 待兔
4年前
【Golang】Golang + jwt 实现简易用户认证
<p本文已同步发布到我的个人博客:<ahref"https://links.jianshu.com/go?tohttps%3A%2F%2Fglorin.xyz%2F2019%2F11%2F23%2FGolangjwtsimpleauth%2F"target"_blank"https://glorin.xyz/2019/11/23/Golang
会飞的鱼 会飞的鱼
4年前
django-allauth 教程(二) 一鼓作气
前言:上一篇:djangoallauth(一)小试牛刀(https://www.helloworld.net/p/admup0SzQFgP)介绍了djangoallauth的安装及基本使用(如用户的注册,登录,邮箱验证和密码重置),然而allauth并没有提供展示和修改用户资料的功能,也没有对用户资料进行扩展。那么本篇就来介绍如何拓展用户个人资料和
Wesley13 Wesley13
3年前
android 正则检测用户名 密码 邮箱
最常用的几个正则匹配://用户名:315任意字符组合usernameRegex/^\\w{3,15}$/;//密码:612任意字符组合passwordRegex/^\\w{6,12}$/;//邮箱:自己实现验证规则emailRegex/^\\w@\\w(\\.\\w)$/;//真实
代码哈士奇 代码哈士奇
4年前
云函数手撸用户体系
使用云函数实现用户系统数据库为腾讯云TDSQL其它服务商云函数通用只需修改index.js返回参数即可主要有用户注册用户登陆邮箱发送验证码邮箱验证码校检邮箱绑定邮箱解绑邮箱验证码登陆生成token校验token其它功能可以在此基础上拓展纯手撸代码云函数环境为nodejs12.13由于我比较穷就不带大家使用短信服务了
Stella981 Stella981
3年前
Shiro要点概览与SpringBoot整合实例
1\.简介概念说明Subject主体,简化点说就是用户实体PrincipalSubject的唯一标识,如id、用户名、手机号、邮箱等Credential凭证信息,主体证明自己的东西,如密码、证书等Authenticator认证器,对Subject身份进行认证,例如验证用户的用户名和密码是否匹配Aut
Stella981 Stella981
3年前
Git初始化配置以及配置github
1,配置用户名和邮箱(这里是我github中配置的用户名和邮箱),执行下面命令后,在C:\\Users\\yaosq盘下会出现一个全局文件.gitconfig.gitconfigglobaluser.name"这里换上你的用户名"gitconfigglobaluser.email"这里换上你的邮箱"!(https://
把帆帆喂饱 把帆帆喂饱
2年前
Springboot整合Redis实现邮箱验证码
Springboot整合Redis实现邮箱验证码开启邮箱服务打开https://mail.qq.com/登录你自己的qq账号选择账户点击开启STMP服务:发送短信:发送完,点击我已发送,然后得到密码:Springboot配置邮箱pom依赖xmlorg.sp
曼成 曼成
1年前
如何集成验证码短信API到你的应用程序
验证码短信API可以帮助你轻松实现用户验证、密码重置和账户恢复等功能,提高用户体验并增强应用程序的安全性。本文将介绍如何将验证码短信API集成到你的应用程序中,以确保你的用户数据得到保护。
曼成 曼成
1年前
一文教你如何在小程序中快速接入验证码短信API
在微信小程序中接入验证码短信API,可以为用户提供便捷的验证服务。本文将详细介绍如何在小程序中实现这一功能,包括UI设计、API请求以及代码实现。