详解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清空textarea等输入框实现代码
Apr 22 Javascript
js动态生成指定行数的表格
Jul 11 Javascript
JavaScript动态改变表格单元格内容的方法
Mar 30 Javascript
js+canvas绘制五角星的方法
Jan 28 Javascript
如何用JS/HTML将时间戳转换为“xx天前”的形式
Feb 06 Javascript
JavaScript无阻塞加载和defer、async详解
Feb 26 Javascript
AngularJS实现tab选项卡的方法详解
Jul 05 Javascript
浅谈 vue 中的 watcher
Dec 04 Javascript
laravel5.3 vue 实现收藏夹功能实例详解
Jan 21 Javascript
Vue-Router基础学习笔记(小结)
Oct 15 Javascript
js回调函数仿360开机
Dec 26 Javascript
js找出5个数中最大的一个数和倒数第二大的数实现方法示例小结
Mar 04 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实现的随机广告显示代码
2007/06/14 PHP
php中$_REQUEST、$_POST、$_GET的区别和联系小结
2011/11/23 PHP
PHP创建桌面快捷方式的实例代码
2014/02/17 PHP
解决Laravel自定义类引入和命名空间的问题
2019/10/15 PHP
ASP中Sub和Function的区别说明
2020/08/30 Javascript
从零开始学习jQuery (十) jQueryUI常用功能实战
2011/02/23 Javascript
jquery获得下拉框值的代码
2011/08/13 Javascript
jquery 鼠标滑动显示详情应用示例
2014/01/24 Javascript
jquery easyui使用心得
2014/07/07 Javascript
jquery append()方法与html()方法的区别及使用介绍
2014/08/01 Javascript
基于NodeJS的前后端分离的思考与实践(三)轻量级的接口配置建模框架
2014/09/26 NodeJs
简化版手机端照片预览组件
2015/04/13 Javascript
JS实现选中当前菜单后高亮显示的导航条效果
2015/10/15 Javascript
JS继承之借用构造函数继承和组合继承
2016/09/07 Javascript
javascript中获取元素标签中间的内容的实现方法
2016/10/08 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
Vue 2.0中生命周期与钩子函数的一些理解
2017/05/09 Javascript
JS实现的全排列组合算法示例
2017/10/09 Javascript
Node.js学习教程之HTTP/2服务器推送【译】
2017/10/31 Javascript
vue 自定义 select内置组件
2018/04/10 Javascript
jquery中attr、prop、data区别与用法分析
2019/09/25 jQuery
浅谈Django学习migrate和makemigrations的差别
2018/01/18 Python
python3+PyQt5实现自定义分数滑块部件
2018/04/24 Python
我喜欢你 抖音表白程序python版
2019/04/07 Python
python程序变成软件的实操方法
2019/06/24 Python
浅谈Django2.0 加xadmin踩的坑
2019/11/15 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
你不知道的5个HTML5新功能
2016/06/28 HTML / CSS
网站域名和主机:Domain.com
2019/04/01 全球购物
Groupon比利时官方网站:特卖和网上购物高达-70%
2019/08/09 全球购物
期中考试后的反思
2014/02/08 职场文书
党性锻炼的心得体会
2014/09/03 职场文书
2014教师评职称工作总结
2014/11/10 职场文书
社区艾滋病宣传活动总结
2015/05/07 职场文书
CSS 圆形进度栏
2021/04/06 HTML / CSS
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL