详解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 相关文章推荐
JavaScript 设计模式 安全沙箱模式
Sep 24 Javascript
html中table数据排序的js代码
Aug 09 Javascript
JavaScript中数组slice和splice的对比小结
Sep 22 Javascript
JS不完全国际化&本地化手册 之 理论篇
Sep 27 Javascript
Node.js中用D3.js的方法示例
Jan 16 Javascript
微信小程序 登录的简单实现
Apr 19 Javascript
移动端手指放大缩小插件与js源码
May 22 Javascript
解决vue2.x中数据渲染以及vuex缓存的问题
Jul 13 Javascript
浅析Angular19 自定义表单控件
Jan 31 Javascript
Vuex的基本概念、项目搭建以及入坑点
Nov 04 Javascript
微信小程序实现卡片层叠滑动效果
Jun 21 Javascript
原生js实现表格循环滚动
Nov 24 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
wampserver改变默认网站目录的办法
2015/08/05 PHP
php curl上传、下载、https登陆实现代码
2017/07/23 PHP
javascript GUID生成器实现代码
2009/10/31 Javascript
javascript实现面向对象类的功能书写技巧
2010/03/07 Javascript
javascript (用setTimeout而非setInterval)
2011/12/28 Javascript
JavaScript高级程序设计 读书笔记之九 本地对象Array
2012/02/27 Javascript
jquery Mobile入门—多页面切换示例学习
2013/01/08 Javascript
解析瀑布流布局:JS+绝对定位的实现
2013/05/08 Javascript
表单提交前触发函数返回true表单才会提交
2014/03/11 Javascript
上传文件返回的json数据会被提示下载问题解决方案
2014/12/03 Javascript
Javascript中typeof 用法小结
2015/05/12 Javascript
javascript中clipboardData对象用法详解
2015/05/13 Javascript
纯js代码制作的网页时钟特效【附实例】
2016/03/30 Javascript
使用jQuery制作遮罩层弹出效果的极简实例分享
2016/05/12 Javascript
浅谈Vue项目骨架屏注入实践
2019/08/05 Javascript
浅谈Vue开发人员的7个最好的VSCode扩展
2021/01/20 Vue.js
全面解析js中的原型,原型对象,原型链
2021/01/25 Javascript
python递归删除指定目录及其所有内容的方法
2017/01/13 Python
selenium+python实现自动化登录的方法
2018/09/04 Python
python实现机器学习之多元线性回归
2018/09/06 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
PyCharm设置Ipython交互环境和宏快捷键进行数据分析图文详解
2020/04/23 Python
Python ConfigParser模块的使用示例
2020/10/12 Python
Canvas与Image互相转换示例代码
2013/08/09 HTML / CSS
eBay法国购物网站:eBay.fr
2017/10/21 全球购物
入党自我评价优缺点
2014/01/25 职场文书
工程招投标邀请书
2014/01/26 职场文书
五年级学生评语
2014/04/22 职场文书
电子商务专业毕业生求职信
2014/06/12 职场文书
青年文明号口号
2014/06/17 职场文书
预防艾滋病宣传标语
2014/06/25 职场文书
安全生产工作汇报材料
2014/10/28 职场文书
2015年学校医务室工作总结
2015/07/20 职场文书
Python进阶学习之带你探寻Python类的鼻祖-元类
2021/05/08 Python
MySQL插入数据与查询数据
2022/03/25 MySQL
Android开发之底部导航栏的快速实现
2022/04/28 Java/Android