邮箱验证码登录

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

//请求验证码
app.post('/reqvc',jsonParser,(req,res)=>{
	let obj=req.body
	let 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,其他各种软件环境其实也没与多大区别。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值