详解node登录接口之密码错误限制次数(含代码)


Posted in Javascript onOctober 25, 2019

密码次数尝试,可以有效的保护用户账户安全,有了限制之后,就算用量子计算机都束手无策。

银行卡也是这种,尝试次数过多,就锁定,说不定还会自动报警。

效果图

详解node登录接口之密码错误限制次数(含代码) 

实现思路

 数据库表设计

在表里面添加一个字段,string类型。里面包含两个数据,密码失败尝试日期 和 次数 如 2019a10a23|10
这里我使用|做数据段分割,a字母做日期分割

代码逻辑

当记录的日期是当天,那么密码错误的时候, 次数+1

当记录的日期不是当天,那么重置

代码封装

这是我实现的简单代码封装

(这里只实现了一天内x次的简单校验,高级规则需要自己改)

/**
 * 尝试登录次数限制
 * login_number [日期, 次数].join('|')
 * 更新到数据库 (更新数据) => {}
 * return {
 * run bool true: 超过 false: 正常
 * start 登录失败后修改状态
 * }
 */
exports.Login_n = (login_number, 更新到数据库) => {
  let run = true
  let 当日登录次数 = 0
  let 当日最多尝试次数 = 10
  var getD = () => {
    var date = new Date()
    var d = [date.getUTCFullYear(), date.getMonth() + 1, date.getDate()].join('a')
    return d
  }
  if(login_number){
    let date = login_number.split('|')[0]
    let n = login_number.split('|')[1]
    if(date == getD()){
      当日登录次数 = (+n)
    }
  }
  if(当日登录次数 >= 当日最多尝试次数){
    run = false
  }
  let 登录失败后修改状态函数 = () => {
    let add_login_number
    let 非当日 = () => {
      更新到数据库([getD(), 0].join('|'))
    }
    let 今天 = (n) => {
      更新到数据库([getD(), n].join('|'))
    }
    if(!login_number){
      非当日()
    }else{
      let date = login_number.split('|')[0]
      let n = login_number.split('|')[1]
      if(date == getD()){
        今天((+n) + 1)
      }
    }
  }
  return {
    run,
    start: 登录失败后修改状态函数
  }
}

使用

引入 & 设置状态

var { Login_n } = require('./login_n')
var login_n = Login_n(login_number, (v) => {
  db('all', 'update t_user set login_number=? where id=?', [v, id]).then(results => {
    console.log('修改登录失败次数记录成功')
  })
})

拦截

if(!login_n.run){
  resolve({
    code: 1,
    msg: '账户异常锁定, 请明天再试'
  })
  return
}

密码错误开始记录

if(results[0].pw !== pw){
  // 登录失败,更新登录次数
  login_n.start()
	resolve({
    code: 1,
    msg: '密码错误'
  })
	return
}

登录完整代码

需要引入上面的(错误限制次数代码)

这里的md5,是为了双重加密,当内部员工拿到数据库密码后也不容易登录, 依赖nodejs内置包 crypto

var crypto = require('crypto')
exports.phone_pw_login = (params, req) => new Promise((resolve, reject) => {
  var { Login_n } = require('./login_n')
  let {pass, phone} = params
  var md5 = crypto.createHash("md5");
  let pw = md5.update(pass).digest('hex').toUpperCase()
  db('all', 'SELECT phone, pw, id, name, login_number from t_user WHERE phone=?', [phone]).then(results => {
    let { login_number, id } = results[0]
    // 账号不存在
    if(results.length == 0){
		  resolve({
		    code: 1,
		    msg: '密码错误', // 避免得知是否注册账号
		  })
    	return
    }

    // 次数校验
    var login_n = Login_n(login_number, (v) => {
      db('all', 'update t_user set login_number=? where id=?', [v, id]).then(results => {
        console.log('修改登录失败次数记录成功')
      })
    })
    if(!login_n.run){
      resolve({
        code: 1,
        msg: '账户异常锁定, 请明天再试'
      })
      return
    }

    if(results[0].pw !== pw){
      // 登录失败,更新登录次数
      login_n.start()
    	resolve({
		    code: 1,
		    msg: '密码错误'
      })
    	return
    } 
    let token = Jwt.Create({phone: results[0].phone, id: id, pw})
    
    resolve({
	    code: 200,
	    msg: {
	    	name: results[0].name,
	    	phone: results[0].phone,
	    	token,
	    }
	  })
  })
  .catch(error => {
    console.log(error)
    resolve({
      code: 1,
      msg: '服务器错误'
    })
  })
})

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用jQuery简化JavaScript开发分析
Feb 19 Javascript
javascript面向对象编程(一) 实例代码
Jun 25 Javascript
Egret引擎开发指南之运行项目
Sep 03 Javascript
解决jQuery使用JSONP时产生的错误
Dec 02 Javascript
jQuery+json实现的简易Ajax调用实例
Dec 14 Javascript
详解如何构建Angular项目目录结构
Jul 13 Javascript
node实现简单的反向代理服务器
Jul 26 Javascript
iview中Select 选择器多选校验方法
Mar 15 Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
Nov 21 Javascript
微信小程序加载机制及运行机制图解
Nov 27 Javascript
JS数组及对象遍历方法代码汇总
Jun 16 Javascript
JS实现无限轮播无倒退效果
Sep 21 Javascript
Vue 用Vant实现时间选择器的示例代码
Oct 25 #Javascript
vue登录以及权限验证相关的实现
Oct 25 #Javascript
vue-next/runtime-core 源码阅读指南详解
Oct 25 #Javascript
JS实现简单tab选项卡切换
Oct 25 #Javascript
vue项目从node8.x升级到12.x后的问题解决
Oct 25 #Javascript
JS实现骰子3D旋转效果
Oct 24 #Javascript
Vue可自定义tab组件用法实例
Oct 24 #Javascript
You might like
使用Linux五年积累的一些经验技巧
2013/06/20 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
PHP实现事件机制实例分析
2015/06/26 PHP
分享五个PHP7性能优化提升技巧
2015/12/07 PHP
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
原创javascript小游戏实现代码
2010/08/19 Javascript
如何将JS的变量值传递给ASP变量
2012/12/10 Javascript
网页加载时页面显示进度条加载完成之后显示网页内容
2012/12/23 Javascript
nodejs的require模块(文件模块/核心模块)及路径介绍
2013/01/14 NodeJs
javascript将url中的参数加密解密代码
2014/11/17 Javascript
JS+CSS模拟可以无刷新显示内容的留言板实例
2015/03/03 Javascript
JavaScript中用toString()方法返回时间为字符串
2015/06/12 Javascript
jQuery过滤HTML标签并高亮显示关键字的方法
2015/08/07 Javascript
js实现的简洁网页滑动tab菜单效果代码
2015/08/24 Javascript
使用node+vue.js实现SPA应用
2016/01/28 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
AngularJs 指令详解及示例代码
2016/09/01 Javascript
jquery加载单文件vue组件的方法
2017/06/20 jQuery
vue 文件目录结构详解
2017/11/24 Javascript
layui前端框架之table表数据的刷新方法
2018/08/17 Javascript
使用Layui搭建后台管理界面的操作方法
2019/09/20 Javascript
element中el-container容器与div布局区分详解
2020/05/13 Javascript
[01:03:59]2018DOTA2亚洲邀请赛3月30日 小组赛B组VGJ.T VS Secret
2018/03/31 DOTA
详解Python中使用base64模块来处理base64编码的方法
2016/07/01 Python
python出现"IndentationError: unexpected indent"错误解决办法
2017/10/15 Python
python里dict变成list实例方法
2019/06/26 Python
Expedia马来西亚旅游网站:廉价酒店,度假村和航班预订
2016/07/26 全球购物
澳大利亚吉他在线:Artist Guitars
2017/03/30 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
如何提高JDBC的性能
2013/04/30 面试题
什么是用户模式(User Mode)与内核模式(Kernel Mode) ?
2015/09/07 面试题
计算机专业毕业生求职信分享
2013/12/24 职场文书
机械设计专业大学生职业生涯规划书范文
2014/09/13 职场文书
授权收款委托书范本
2014/10/10 职场文书
2016年圣诞节寄语(一句话)
2015/12/07 职场文书
MySQL系列之十四 MySQL的高可用实现
2021/07/02 MySQL