详解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 相关文章推荐
用js实现的页面关键字密度查询代码
Dec 27 Javascript
extjs 学习笔记(三) 最基本的grid
Oct 15 Javascript
Zero Clipboard js+swf实现的复制功能使用方法
Mar 07 Javascript
jQuery中json对象的复制方式介绍(数组及对象)
Jun 08 Javascript
两个select多选模式的选项相互移动(示例代码)
Jan 11 Javascript
js toFixed()方法的重写实现精度的统一
Mar 06 Javascript
浅谈JavaScript中指针和地址
Jul 26 Javascript
JQuery解析XML数据的几个简单实例
May 18 Javascript
vue里面v-bind和Props 利用props绑定动态数据的方法
Aug 27 Javascript
react 应用多入口配置及实践总结
Oct 17 Javascript
mpvue实现小程序签到金币掉落动画(api实现)
Oct 17 Javascript
vue 检测用户上传图片宽高的方法
Feb 06 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
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
thinkphp 字母函数详解T/I/N/D/M/A/R/U
2017/04/03 PHP
php的常量和变量实例详解
2017/06/27 PHP
PHP时间函数使用详解
2019/03/21 PHP
用js统计用户下载网页所需时间的脚本
2008/10/15 Javascript
js和jquery使按钮失效为不可用状态的方法
2014/01/26 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
js设置文本框中焦点位置在最后的示例代码(简单实用)
2014/03/04 Javascript
Node.js+Express配置入门教程详解
2016/05/19 Javascript
微信小程序 教程之事件
2016/10/18 Javascript
使用JS编写的随机抽取号码的小程序
2017/08/11 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
使用mock.js随机数据和使用express输出json接口的实现方法
2018/01/07 Javascript
JS canvas绘制五子棋的棋盘
2020/05/28 Javascript
JS获取月的第几周和年的第几周实例代码
2018/12/05 Javascript
vue使用nprogress实现进度条
2019/12/09 Javascript
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
Python中的Matplotlib模块入门教程
2015/04/15 Python
python实现的系统实用log类实例
2015/06/30 Python
python执行系统命令后获取返回值的几种方式集合
2018/05/12 Python
python脚本监控Tomcat服务器的方法
2018/07/06 Python
python tkinter canvas 显示图片的示例
2019/06/13 Python
python用类实现文章敏感词的过滤方法示例
2019/10/27 Python
PyQt5 closeEvent关闭事件退出提示框原理解析
2020/01/08 Python
Python运行异常管理解决方案
2020/03/09 Python
解决python脚本中error: unrecognized arguments: True错误
2020/04/20 Python
浅谈Python中的模块
2020/06/10 Python
Python识别处理照片中的条形码
2020/11/16 Python
松本清官方海外旗舰店:日本最大的药妆连锁店
2017/11/21 全球购物
俄罗斯隐形眼镜和眼镜在线商店:Cronos
2020/06/02 全球购物
初中数学教学反思
2014/01/16 职场文书
社区巾帼文明岗事迹材料
2014/06/03 职场文书
大学专科求职信
2014/07/02 职场文书
2014年群众路线教育实践活动整改措施
2014/09/24 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书