炫酷又实用的发送邮箱链接修改密码

        第一次写博客就拿出纯干货,手把手教你解决如何通过邮箱发送链接修改密码,这个是我在工作中实际遇到的情况,经过多次调试,可靠好用。

目录

需求分析:

一、准备工作:

二、发送链接:

三、点击链接(不做234条的可以跳过)

四、最终修改密码


需求分析

最终目标:

        实现用户点击找回密码,选择邮箱方式后,向用户邮箱中发送一个修改链接,用户点击链接跳转到修改密码页面,提交后修改密码成功。

细节:

        1:需要保证链接的唯一性,同时因为无登陆状态,链接应该能准确指向当前修改用户。

        2:(可选)安全考量,设置链接在某个时间段内有效,一般为10分钟;

        3:(可选)安全考量,设置链接仅可点击一次,退出再进,或者重复进入,均应被拒绝。

        4:(可选)安全考量,当用户点击多次,发送多个链接时,仅最后一次发送的链接有效。

        为什么说2和3是可选的呢,因为笔者在考察其他网站业务时,发现有一些大型知名网站并没有此类限制,可能目前手机验证码改密才是主流,而邮箱改密则被轻视,随便做了。这个可以根据自己业务需求设置专业程度。(手机号验证码改密,有需要的话,后面也会出)。考虑到以上三点基本就可以做出一个可用性和安全性强的邮箱改密功能。

        ps:做这个模块时候,经理曾说,你这个链接时谁点都能改吗,那不是很危险了。众所周知,产品经理是一种奇特的生物,他要求我在链接上加上身份验证,同学们,修改密码链接加上身份验证就意味着需要登录操作,用户密码都忘了怎么个登录法?最后在我据理力争下,经理放弃了他的想法和要求!

好了进入正题:

一、准备工作:

        这个业务可以是登录也的忘记密码进入,也可以是个人中心的修改密码进入,可以根据自己需求加入对邮箱的验证,这个自己拿捏;

二、发送链接:

       我们先参考一个其他公司的修改链接,做出分析:

 无非就是一个固定链接后面加上一个或多个“随机”参数,固定地址指向跳转的页面,参数负责确定安全校验和提交后的身份确定。

于是我就大胆地开始了随机参数的准备,采用生成uuid作为随机参数,以该随机参数作为key,以用户信息和安全验证信息作为value,存入redis;代码如下:

        //业务前缀,可以自己定义,我这里是提前定义的常量,可替换String key = KEY_RESET_PWD_REDIS;//对邮箱进行加密,作为拼接的key,保证用一个邮箱只存储一份信息String code = MD5Utils.md5(keyChecker);//uuid作为随参数,保证链接的唯一性,同时确保了多个链接仅最后一个有效,也可采用其他策略String checkCode = UUID.randomUUID().toString(true);//构建value的值HashMap<String, String> map = new HashMap<>();//用户id,用于指向修改用户map.put("id",studentId.toString());//随机验证码,保证链接的唯一性map.put("checkCode",checkCode);//邮箱也存储上去,可多重验证map.put("email",keyChecker);//字段限制链接只能访问一次//map.put(KEY_LINK_VISIT,LINK_CANUSE_TRUE);map.put("visit","0");//存入redis,设置过期时间redisTemplate.opsForHash().putAll(key+code,map);redisTemplate.expire(key+code,REDIS_LINK_TTL,TimeUnit.MINUTES);

   上面为核心代码,下面我将发送链接业务全部代码贴下:

public Result<?> sendLinkWithEmail(String keyChecker) {//获取当前登陆用户idLong studentId = UserUtil.getUserDetails().getUserAuths().getUserId();//通过用户id去查询用户邮箱UserAuths userAuths = userAuthsService.getOne(new LambdaQueryWrapper<UserAuths>().eq(UserAuths::getUserId, studentId).eq(UserAuths::getIdentityType, IDENTITYTYPE_EMAIL));//验证keyChecker是否是用户绑定的邮箱if (Objects.isNull(userAuths) || !userAuths.getIdentifier().equals(keyChecker)){return Result.failed("邮箱非绑定邮箱");}/*准备发送前,验证用户请求频率*/if (!checkedRequestFrequency(keyChecker)){return Result.failed("请求过于频繁");}String key = KEY_RESET_PWD_REDIS;//在链接中加入随机uuid作为验证,只保证最后一次链接有效String code = MD5Utils.md5(keyChecker);String checkCode = UUID.randomUUID().toString(true);HashMap<String, String> map = new HashMap<>();map.put("id",studentId.toString());map.put("checkCode",checkCode);map.put("email",keyChecker);//字段限制链接只能访问一次map.put(KEY_LINK_VISIT,LINK_CANUSE_TRUE);redisTemplate.opsForHash().putAll(key+code,map);redisTemplate.expire(key+code,REDIS_LINK_TTL,TimeUnit.MINUTES);String link = RESET_PWD_LINK_PREFIX+"?code="+code+"&checkCode="+checkCode;//调用提前写好的发送邮件的工具类,将链接发送到用户邮箱内//因发送邮件不是核心业务,这里不再赘述,不会的可以参考其他博主资料,也可留言我会再出教程。 SendEmailUtil.sendHtmlMail(keyChecker,RESET_PWD_SUBJECT,SEND_LINK_RESET_PWD(link),EMAIL_FROM);return Result.succeed("email","修改链接已发送至邮箱");}

       (需要邮件发送教程的请留言,或关注后续文章,比较简单,可能会出。)

三、点击链接(不做234条的可以跳过)

        要保证链接只能点击一次,10分钟内有效等功能,需要在用户点击链接跳转的进入页面,页面尚未渲染前,发送一个验证请求,参数就是我们链接上的连个参数,验证通过,成功跳转,验证不通过则直接跳转到错误页面。

 public String getInfoAndCheckLink(String code,String checkCode){String key = KEY_RESET_PWD_REDIS;//获取到上一步存储的信息Map entries = redisTemplate.opsForHash().entries(key + code);//验证存储的visit是否已访问,如果访问过一次则验证不通过if (entries.get(KEY_LINK_VISIT).toString().equals(LINK_CANUSE_FALSE)){return null;}//是第一次访问,则修改该值为 已访问 状态redisTemplate.opsForHash().put(key+code,KEY_LINK_VISIT,LINK_CANUSE_FALSE);//验证uuid随机字符串,保证链接是最后一次发送的链接(多次点击发送的话)if (checkCode.equals(entries.get("checkCode").toString())){return entries.get("email").toString();}return null;}

四、最终修改密码

        所有验证都通过后,用户在前台提交新密码,进行修改操作。

public Result<?> resetPassWordByEmail(String password, String code, String checkCode) {String key = KEY_RESET_PWD_REDIS;//同样取出保存在redis的用户信息Map entries = redisTemplate.opsForHash().entries(key + code);//验证链接时间是否在有效期内if (entries.size()==0 || !entries.get("checkCode").equals(checkCode)){return Result.failed("链接已失效");}//新密码加密策略,根据自己业务需要决定// 重新生成盐值String salt = UUID.randomUUID().toString(true);// 加密password = SHA1Utils.sha1(password, salt);//修改密码boolean isSuccess = userAuthsService.update(new LambdaUpdateWrapper<UserAuths>().set(UserAuths::getPassword, password).set(UserAuths::getSalt,salt).eq(UserAuths::getUserId, entries.get("id")));if (isSuccess){redisTemplate.delete(key + code);return Result.succeed("修改成功");}return Result.failed("修改失败,请重试");}

至此,邮箱改密全部业务逻辑和业务代码搞定,你学会了吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/44758.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

163邮箱POP3/SMTP/IMAP/EXCHANGE设置方法分享

目录 拿到163邮箱授权码开始POP3设置IMAP设置EXCHANGE设置 拿到163邮箱授权码 首先要拿到163邮箱的授权码&#xff0c;进入https://mail.163.com/&#xff0c;登陆自己的邮箱&#xff0c;在设置->POP3/SMTP/IMAP选项中 在该页面开启服务和获得授权码&#xff0c;授权码是第…

hotmail邮箱pop3服务器设置方法

hotmail邮箱 的POP3/SMTP功能只向Hotmail Plus的用户开放&#xff0c;普通用户想要使用这一功能的话&#xff0c;得进行一些特别的设置。现在这一功能总算面向所有的用户开放了&#xff0c;尽管微软官方还没宣布这一消息&#xff0c;在邮件设置里也看不到有关POP3/SMTP的介…

ps4变更账号服务器,ps4怎么变更账户邮箱-ps4更改账户邮箱的方法

有朋友可能会想知道ps4怎么变更账户邮箱&#xff0c;那么接下来小编就为大家分享一波ps4更改账户邮箱的方法&#xff0c;这个问题是否也困扰着你呢?快来一起了解一下吧 可以在电脑上登录进入到该网站后台&#xff0c;点击编辑个人简介&#xff0c;然后在出现的页面中输入需要绑…

Microsoft Outlook设置GMail谷歌邮箱

本文适用于 Windows 11 Microsoft Outlook 365。参考了 为何用outlook设置Gmail无法通过验证&#xff1f; - 知乎、https://support.google.com/mail/answer/7104828、通过其他电子邮件平台查看 Gmail - Gmail帮助 (google.com)、Add a Gmail account to Outlook (microsoft.co…

在foxmail和outlook中设置QQ邮箱、gmail邮箱、新浪邮箱、微软邮箱、网易邮箱等的方法...

怎么用邮件客户端如outlook和foxmail来设置各种邮箱<?xml:namespace prefix "o" ns "urn:schemas-microsoft-com:office:office" /> 很多人平时都是在网页上面收发邮件&#xff0c;这个很简单&#xff0c;不用其他的设置&#xff0c;不过在客户端…

如何修改git的用户邮箱

今天工作中上传代码失败&#xff0c;后面发现是我的邮箱不知道为什么少了个 q 这时候需要先修改邮箱 修改全局 如果你要修改当前全局的用户名和邮箱时&#xff0c;需要在上面的两条命令中添加一个参数&#xff0c;--global&#xff0c;代表的是全局。 命令分别为&#xff1a;…

Git修改用户名和邮箱

前言&#xff1a; 最近在提交代码时发现用户名和邮箱很长&#xff0c;感觉很奇怪&#xff0c;于是通过Git命令修改了一下用户名&#xff0c;用户名截图如下: 修改步骤如下: 1.进入Git的安装目录&#xff0c;找到git\git-cmd.exe,例如我的目录是D:\softwore\git\Git&#xff0…

git--修改用户名和邮箱的方法(全局修改和局部修改)

原文网址&#xff1a;git--修改用户名和邮箱的方法&#xff08;全局修改和局部修改&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍如何修改git的用户名和邮箱&#xff0c;包括&#xff1a;如何全局修改用户名和邮箱&#xff0c;如何只修改某个项目的用户名和密码&…

AIGC大模型时代下,该如何应用高性能计算PC集群打造游戏开发新模式?

ACT | SIM | ETC | FTG | RAC AVG | RPG | FPS | MUG | PUZ ACT、SIM、ETC、FTG、RAC、RTS、STG、AVG、RPG、FPS、MUG、PUZ、SLG、SPG等游戏类型&#xff0c;需要高性能的计算机来支持运行。为了满足这些游戏的需求&#xff0c;国内服务器厂商不断推出新的产品&#xff0c;采用…

OpenAI 又赢麻了谷歌 DeepMind 创始人刚称 Gemini 能碾压 GPT-4

整理 | 褚杏娟&#xff0c;核子可乐 谷歌在上个月的开发者大会上公布了一系列 AI 新项目&#xff0c;当时首次亮相的 Gemini 曾受到不少嘲讽。但近日&#xff0c;DeepMind 联合创始人兼 CEO Demis Hassabis 自曝&#xff0c;工程师们正在使用 AlphaGo 的技术来开发 Gemini&…

京东成立拍卖公司 注资资本500万元

【TechWeb】7月16日消息&#xff0c;据天眼查公开的信息显示&#xff0c;7月12日&#xff0c;北京京东世纪贸易有限公司成立全资子公司广东京东瀚英拍卖有限公司&#xff0c;注册资本为500万元人民币&#xff0c;法定代表人为张奇。 资料显示&#xff0c;广东京东瀚英拍卖有限公…

阿里巴巴将向印度社交视频平台Vmate注资1亿美元

【TechWeb】5月31日消息&#xff0c;据国外媒体报道&#xff0c;阿里巴巴表示&#xff0c;将向印度社交视频平台Vmate注资1亿美元。此举正值阿里巴巴正重新尝试进入不断增长的社交视频应用市场之际。 阿里巴巴正在印度蓬勃发展的视频市场上加倍下注&#xff0c;希望击败竞争对手…

梅西 ≠ 一人一城?

周末了&#xff0c;扯扯蛋。 最近国际足坛最轰炸性的消息&#xff0c;莫过于梅老板不续约了&#xff0c;而且令人惊奇的是巴塞罗那单方宣布的&#xff0c;甚至在官网&#xff0c;清空了梅西的所有信息&#xff0c;做的很彻底。 暂时不说别的&#xff0c;用一组数字&#xff0c;…

他们将成为自己想成为的模样:华为云为开发者未来“注资”

文/ IT创事记 祁萌 上午9点&#xff0c;薄雾消散&#xff0c;世博园的周边准点迎来了第三天例行的人潮涌动&#xff0c;就像已经过去的两天一样。不同之处只是在于&#xff0c;前两天满目的正装“灰发族”开始被休闲服和T恤衫的“黑发族”所取代&#xff0c;志愿者手中的导引牌…

从球衣了解“红魔”曼联历史

我是个足球迷&#xff0c;但是岁数大了&#xff0c;踢不动了&#xff0c;换成了打卡球场&#xff0c;每到一个城市&#xff0c;无论是国内国外&#xff0c;都会到当地球场&#xff0c;结合他的历史&#xff0c;体验一下。现在因为疫情&#xff0c;少了很多机会&#xff0c;期待…

腾讯再注资,下一个互联网“风口”出现?对普通人有什么影响?

10月29日消息&#xff0c;当地时间28日&#xff0c;社交媒体巨头“脸书”&#xff08;Facebook&#xff09;CEO扎克伯格在公司的活动上&#xff0c;宣布将公司改名为“Meta”。 扎克伯格称&#xff0c;新名字更符合该公司对“元宇宙”的日益关注。这也使得“元宇宙”的概念再次…

驭势科技引入国家队战略注资,完成超10亿元人民币融资

驭势科技完成累计金额超10亿元人民币的新一轮融资 国开制造业转型基金战略注资&#xff0c;是其在自动驾驶领域的首笔投资 本轮融资引入了众多产业投资方 今日&#xff0c;驭势科技&#xff08;UISEE&#xff09;宣布完成累计金额超10亿元人民币的新一轮融资&#xff0c;并获得…

谁在抢占「低代码」高地?

【深几度海外观察系列】 撰稿|吴俊宇 审阅|梁欣婷 「摘要:2020年,新冠疫情大流行引发企业快速数字化诉求。低代码开发顺势成为潮流。这股潮流在2021年进一步被推高。但低代码开发不是新鲜事物。2010年开始欧美信息化领域就在酝酿这一趋势。这是欧美信息化发展到成熟阶段…

牛!2020年,这项技术将获得1,000,000,000元人民币注资!

在今年的特殊情况下&#xff0c;国外的AI明星公司轰然倒塌&#xff0c;一夜之间倒闭。 又有某AI大厂一年亏了60亿…… 就像看破楼市一样&#xff0c;我们不由心想&#xff1a; “AI&#xff0c;会不会从头到尾就是一场泡沫&#xff1f;” 但是&#xff0c;最近国家发的“定心丸…

国内常见的14款低代码平台介绍

目录 1、云程低代码平台 2、ClickPaaS 3、阿里云宜搭 4、华为云AppCube 5、腾讯云微搭 6、百度爱速搭 7、网易轻舟 8、字节飞书多维表格 9、用友YonBuilder 10、金蝶苍穹云平台 11、泛微平台 12、蓝凌低代码平台 13、简道云 14、轻流 今天给大家分享国内常见的14…