詳解node登錄接口之密碼錯(cuò)誤限制次數(shù)(含代碼)
密碼次數(shù)嘗試,可以有效的保護(hù)用戶賬戶安全,有了限制之后,就算用量子計(jì)算機(jī)都束手無(wú)策。
銀行卡也是這種,嘗試次數(shù)過(guò)多,就鎖定,說(shuō)不定還會(huì)自動(dòng)報(bào)警。
效果圖
實(shí)現(xiàn)思路
數(shù)據(jù)庫(kù)表設(shè)計(jì)
在表里面添加一個(gè)字段,string類(lèi)型。里面包含兩個(gè)數(shù)據(jù),密碼失敗嘗試日期 和 次數(shù) 如 2019a10a23|10
這里我使用|做數(shù)據(jù)段分割,a字母做日期分割
代碼邏輯
當(dāng)記錄的日期是當(dāng)天,那么密碼錯(cuò)誤的時(shí)候, 次數(shù)+1
當(dāng)記錄的日期不是當(dāng)天,那么重置
代碼封裝
這是我實(shí)現(xiàn)的簡(jiǎn)單代碼封裝
(這里只實(shí)現(xiàn)了一天內(nèi)x次的簡(jiǎn)單校驗(yàn),高級(jí)規(guī)則需要自己改)
/**
* 嘗試登錄次數(shù)限制
* login_number [日期, 次數(shù)].join('|')
* 更新到數(shù)據(jù)庫(kù) (更新數(shù)據(jù)) => {}
* return {
* run bool true: 超過(guò) false: 正常
* start 登錄失敗后修改狀態(tài)
* }
*/
exports.Login_n = (login_number, 更新到數(shù)據(jù)庫(kù)) => {
let run = true
let 當(dāng)日登錄次數(shù) = 0
let 當(dāng)日最多嘗試次數(shù) = 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()){
當(dāng)日登錄次數(shù) = (+n)
}
}
if(當(dāng)日登錄次數(shù) >= 當(dāng)日最多嘗試次數(shù)){
run = false
}
let 登錄失敗后修改狀態(tài)函數(shù) = () => {
let add_login_number
let 非當(dāng)日 = () => {
更新到數(shù)據(jù)庫(kù)([getD(), 0].join('|'))
}
let 今天 = (n) => {
更新到數(shù)據(jù)庫(kù)([getD(), n].join('|'))
}
if(!login_number){
非當(dāng)日()
}else{
let date = login_number.split('|')[0]
let n = login_number.split('|')[1]
if(date == getD()){
今天((+n) + 1)
}
}
}
return {
run,
start: 登錄失敗后修改狀態(tài)函數(shù)
}
}
使用
引入 & 設(shè)置狀態(tài)
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('修改登錄失敗次數(shù)記錄成功')
})
})
攔截
if(!login_n.run){
resolve({
code: 1,
msg: '賬戶異常鎖定, 請(qǐng)明天再試'
})
return
}
密碼錯(cuò)誤開(kāi)始記錄
if(results[0].pw !== pw){
// 登錄失敗,更新登錄次數(shù)
login_n.start()
resolve({
code: 1,
msg: '密碼錯(cuò)誤'
})
return
}
登錄完整代碼
需要引入上面的(錯(cuò)誤限制次數(shù)代碼)
這里的md5,是為了雙重加密,當(dāng)內(nèi)部員工拿到數(shù)據(jù)庫(kù)密碼后也不容易登錄, 依賴nodejs內(nèi)置包 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]
// 賬號(hào)不存在
if(results.length == 0){
resolve({
code: 1,
msg: '密碼錯(cuò)誤', // 避免得知是否注冊(cè)賬號(hào)
})
return
}
// 次數(shù)校驗(yà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('修改登錄失敗次數(shù)記錄成功')
})
})
if(!login_n.run){
resolve({
code: 1,
msg: '賬戶異常鎖定, 請(qǐng)明天再試'
})
return
}
if(results[0].pw !== pw){
// 登錄失敗,更新登錄次數(shù)
login_n.start()
resolve({
code: 1,
msg: '密碼錯(cuò)誤'
})
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: '服務(wù)器錯(cuò)誤'
})
})
})
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ajax +NodeJS 實(shí)現(xiàn)圖片上傳實(shí)例
本篇文章主要介紹了ajax +NodeJS 實(shí)現(xiàn)圖片上傳實(shí)例,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06
使用 Node.js 實(shí)現(xiàn)圖片的動(dòng)態(tài)裁切及算法實(shí)例代碼詳解
這篇文章主要介紹了使用 Node.js 實(shí)現(xiàn)圖片的動(dòng)態(tài)裁切功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-09-09
Node koa服務(wù)器實(shí)現(xiàn)獲取客戶端ip
這篇文章主要為大家詳細(xì)介紹了Node koa服務(wù)器實(shí)現(xiàn)獲取客戶端ip的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起了解下2025-02-02
node?gyp安裝canvas原生模塊編譯node?pregyp詳解
這篇文章主要為大家介紹了Nodejs關(guān)于原生模塊編譯node-gyp + node-pre-gyp (以安裝canvas為例)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
基于NodeJS的前后端分離的思考與實(shí)踐(一)全棧式開(kāi)發(fā)
這個(gè)話題最近被討論得比較多,阿里有些BU也在進(jìn)行一些嘗試。討論了很久之后,我們團(tuán)隊(duì)決定探索一套基于NodeJS的前后端分離方案,過(guò)程中有一些不斷變化的認(rèn)識(shí)以及思考,記錄在這里,也希望看到的同學(xué)參與討論,幫我們完善。2014-09-09
nodejs個(gè)人博客開(kāi)發(fā)第二步 入口文件
這篇文章主要為大家詳細(xì)介紹了nodejs個(gè)人博客開(kāi)發(fā)的入口文件,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04

