邮箱验证码登录

最近支持一个matlab的开发项目,app端采用的是app designer开发,考虑到安全性,需要做登录认证,研讨了下,实现方案如下:
app启动后运行一个独立的登录窗口,认证通过后登录窗口关闭,显示功能窗口可以进行后续业务操作。
登录采用邮箱验证码方式,用户输入邮箱,点击发送验证码,app调用webwrite向后端web接口请求发送验证码,在邮箱中查收验证码后,在验证码栏输入验证码,点击登录按钮,调用webwrite向后端web接口发起验证,获取返回成功消息后,登录成功,关闭登录窗,进入功能窗,否则提示返回信息,继续停留在登录窗口。
邮箱验证码登录其实还有个好处,它不会在泄露用户的密码,无论是在前端app还是网络传输或是后端服务器上,涉及到密码的填写、传输、保存都非常敏感,虽然我们传输采用https,但是证书如果保管不善,仍有可能泄密,前端app和后端nodejs,你无条件信任开发人员的操守么,他们使用的开发工具、环境和依赖库是否存在漏洞和后门,细思极恐啊。。。
下面将nodejs实现的后端两个接口介绍下:

//请求验证码
app.post('/reqvc',jsonParser,(req,res)=>{let obj=req.bodylet clientip=req.header('x-forwarded-for')?req.header('x-forwarded-for'):req.ip;let ipsent=sentrecs.find(item=>(item.ip==clientip));let now=Date.now();if ((ipsent!=undefined)&&(ipsent.lasttime>now-60000)) return res.json({"msg":"据上次发送验证码时间不到一分钟"});let matchuser=appusers.find(item=>(item.email==obj.email.toLowerCase()));if (matchuser==undefined) return res.json({"msg":"非授权用户"});let code=stringRandom(6, { letters: false });smtpc.sendmail({"host" : jargs.mailhost,"from" : jargs.mailsender,"to" :  obj.email,"content" : {"subject" : "MatLabApp登录验证码","content-type" : "text/html","content" : code},"success" :()=> { logger.info("邮件验证码已发送"); mailcode=mailcode.filter(item=>(item.id!=obj.email.toLowerCase())); mailcode.push(JSON.parse(JSON.stringify({"id":obj.email.toLowerCase(),"code":code})));sentrecs=sentrecs.filter(item=>(item.ip!=clientip)); sentrecs.push(JSON.parse(JSON.stringify({"ip":clientip,"lasttime":now}))); res.json({"msg":"succ"}); },"failure" : (err)=> { logger.error("邮件发送出错"); res.json({"msg":"邮件发送出错"}); }});
});

加入了下发送邮件频次的限制,每个客户端每分钟只能请求一次邮箱验证码

app.post('/matlogin',jsonParser,(req,res)=>{let obj= req.body;let clientip=req.header('x-forwarded-for')?req.header('x-forwarded-for'):req.ip;logger.info(obj.email+" 尝试登录");let now=new Date();let item=loginfaillist.find(itm=>(itm.ip==clientip));if ((item!=undefined)&&(now<item.permittime)) { res.json({msg:"该IP已触发登录异常,请于"+item.permittime.toLocaleTimeString()+"后再尝试"}); }else {matchcode=mailcode.find(item=>((item.id===obj.email.toLowerCase())&&(item.code==obj.vc)));if (matchcode!=undefined) {logger.info("认证成功 "+obj.email);loginfaillist=loginfaillist.filter(itm=>(itm.ip!=req.ip));mailcode=mailcode.filter(item=>(item.id!=obj.email));let matchuser=matlabusers.find(item=>(item.email==obj.email.toLowerCase()));res.json({msg:"succ",userid:matchuser.uid.toLowerCase(),username:matchuser.username});}else {addfail(now,clientip);logger.error("认证出错 "+obj.uid); res.json({msg:"认证出错"}); }}
});

加入了下登录失败策略,具体处理方法前面的文章有介绍
本文介绍的邮箱验证码方案比较简单通用,客户端开发只要支持http访问即可实现,不限于matlab,其他各种软件环境其实也没与多大区别。

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

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

相关文章

【web算法】列车车厢重排问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学习,不断总结,共同进步,活到老学到老导航 檀越剑指大厂系列:全面总结 jav…

Flutter开发中问题及解决方案

1&#xff0c;数据类型转换时使用tryParse可以减少类型转换异常&#xff0c;在转换异常时&#xff0c;返回默认值 例如 double.tryParse(item.totalfee ?? 0) ?? 0 2&#xff0c;使用setState时&#xff0c;增加mounted判断&#xff0c;减少因为执行耗时任务刷新界面时&…

中国民用航空局关于民用无人驾驶航空器监管服务有关事宜的公告

《无人驾驶航空器飞行管理暂行条例》&#xff08;以下简称《条例》&#xff09;将于2024年1月1日实施。民航局依据《条例》所赋予的职责&#xff0c;为便于大家遵守&#xff0c;现将具体监管和服务有关事宜公告如下&#xff1a; 一、交通运输部即将颁布《民用无人驾驶航空器运行…

大数据开发--02.环境准备

一.准备三台linux虚拟机 1.分别取名node1,node2,node3 2.配置静态ip 这里以node1为例&#xff0c;配置静态ip地址&#xff0c;其他node2.node3一样 配置完成之后别忘记 systemctl restart network 3.在各自的/etc/hosts文件中编辑三个Ip地址 三台都要配置&#xff0c; 4.然…

功率电感的工艺结构原理及选型参数总结

🏡《总目录》 目录 1,概述2,工作原理3,结构特点3.1,主要构成材料3.2,绕组形式3.3,封装与骨架4,工艺流程4.1,选择磁芯4.2,绕制线圈4.3,焊接线头4.4,测试5,选型参数5.1࿰

【PostGresql】------ pg多表数据多个条件汇总 使用 union 方法示例代码

1. 示例代码如下&#xff1a; SELECT"ID","DT_DATE","CNAME","RMAN_NAME","DEP_NAME","DEP_ID","INVEST_MAN_NAME","TYPE_NAME","INVEST_LEVEL_NAME","POSITION_NAME",…

第1关:创建数据库

任务描述 创建一个名为mydata的数据库。 相关知识 MySQL创建数据库的语法如下&#xff1a; 其中&#xff0c;database_name是要创建的数据库的名称。 开始你的任务吧&#xff0c;祝你成功&#xff01; #请在此处添加实现代码 ########## Begin ########## CREATE DATABASE …

探索Python中的聚类算法:K-means

在机器学习领域中&#xff0c;聚类算法被广泛应用于数据分析和模式识别。K-means 是其中一种常用的聚类算法&#xff0c;它能够将数据集分成 K 个不同的组或簇。本文将详细介绍 K-means 算法的原理、实现步骤以及如何使用 Python 进行编程实践。 什么是 K-means&#xff1f; …

asp.net在线租车平台

说明文档 运行前附加数据库.mdf&#xff08;或sql生成数据库&#xff09; 主要技术&#xff1a; 基于asp.net架构和sql server数据库 功能模块&#xff1a; asp.net在线租车平台 用户功能有首页 行业新闻用户注册车辆查询租车介绍访问后台 后台管理员可以进行用户管理 管…

套路化编程:C++与C#之间的zlib(libz)压缩传输

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github&#xff1a;codetoys 因为需要压缩&#xff0c;因为一端是C&#xff0c;所以用了zlib&#xff08;libz&#xff09;&#xff0c;因为用了zlib&#xff0c;所以C#端也要用兼容zlib格式的方法。 目录 一、技术要点 1.1…

ubuntu20.04安装Pycharm

下载pycharm安装包 https://www.jetbrains.com/pycharm/download/#sectionlinux 使用社区版点击download 下载好的pycharm如图所示&#xff0c;右键解压&#xff1a; 打开终端&#xff0c;输入cd命令&#xff0c;进入刚刚解压文件夹下的bin文件夹&#xff0c;命令行是cd 文…

深度优先搜索(DFS)与广度优先搜索(BFS)在 Java 中的应用

引言&#xff1a; 在算法和数据结构中&#xff0c;深度优先搜索&#xff08;Depth First Search&#xff0c;DFS&#xff09;和广度优先搜索&#xff08;Breadth First Search&#xff0c;BFS&#xff09;是两种常用的图遍历算法。它们在解决图相关问题时非常有用&#xff0c;可…

19.WEB渗透测试--抓包技术(下)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;18.WEB渗透测试--抓包技术&#xff08;上&#xff09;-CSDN博客 Burp含义和内容参考&…

CCDP.01.使用NotePad++辅助部署OpenStack的说明

前言 对于象OpenStack&#xff08;OS&#xff09;这样的复杂分布式系统&#xff08;云计算平台&#xff09;&#xff0c;一次部署通过是需要相当的Linux基础、网络基础、分布式系统基础、云计算基础的。这里类比在开发大型复杂系统常常采用的“防御式编程”方法论&#xff0c;探…

LoadBalancerCacheManager not available, returning delegate without caching

警告&#xff1a;LoadBalancerCacheManager not available, returning delegate without caching 背景&#xff1a;更换了redis集群 解决方案&#xff1a; 重启gateway网关服务 也就是重启引用下面这个包的服务 <dependency><groupId>org.springframework.cloud…

写一个简单的 C++ 日志库 - cllogger(3)- CRT

通过上一篇 《写一个简单的 C 日志库 - cllogger&#xff08;2&#xff09;- 日期时间》我们已经掌握了如何通过 std::chrono 提供的日期时间工具转换时间参数为指定格式的字符串。 现在我们可以把各个参数信息拼装为 Entry 实例&#xff0c;交给 OutputMessage() void cllog…

视频无水印批量下载软件|抖音视频提取工具

视频无水印批量下载软件 在当今社交媒体充斥着大量优质视频内容的时代&#xff0c;很多用户都希望能够轻松下载自己喜爱的视频进行收藏或分享。为了满足用户的需求&#xff0c;我们特别推出了一款专业的视频无水印批量下载软件&#xff0c;让您可以方便快捷地获取喜爱的视频内容…

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载

最新梨花带雨网页音乐播放器二开优化修复美化版全开源版本源码下载 梨花带雨播放器基于thinkphp6开发的XPlayerHTML5网页播放器前台控制面板,支持多音乐平台音乐解析。二开内容:修复播放器接口问题,把接口本地化,但是集成外链播放器接口就不本地化了,我花钱找人写的理解下…

[C语言]——内存函数

目录 一.memcpy使用和模拟实现&#xff08;内存拷贝&#xff09; 二.memmove 使用和模拟实现 三.memset 函数的使用&#xff08;内存设置&#xff09; 四.memcmp 函数的使用 C语言中规定&#xff1a; memcpy拷贝的就是不重叠的内存memmove拷贝的就是重叠的内存但是在VS202…

C++总结

数据类型 基本的内置类型 修饰符类型 C 允许在 char、int 和 double 数据类型前放置修饰符。 修饰符是用于改变变量类型的行为的关键字&#xff0c;它更能满足各种情境的需求。 类型限定符 函数 以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的&am…