詳解node登錄接口之密碼錯(cuò)誤限制次數(shù)(含代碼)
密碼次數(shù)嘗試,可以有效的保護(hù)用戶賬戶安全,有了限制之后,就算用量子計(jì)算機(jī)都束手無策。
銀行卡也是這種,嘗試次數(shù)過多,就鎖定,說不定還會(huì)自動(dòng)報(bào)警。
效果圖
實(shí)現(xiàn)思路
數(shù)據(jù)庫表設(shè)計(jì)
在表里面添加一個(gè)字段,string類型。里面包含兩個(gè)數(shù)據(jù),密碼失敗嘗試日期 和 次數(shù) 如 2019a10a23|10
這里我使用|做數(shù)據(jù)段分割,a字母做日期分割
代碼邏輯
當(dāng)記錄的日期是當(dāng)天,那么密碼錯(cuò)誤的時(shí)候, 次數(shù)+1
當(dāng)記錄的日期不是當(dāng)天,那么重置
代碼封裝
這是我實(shí)現(xiàn)的簡單代碼封裝
(這里只實(shí)現(xiàn)了一天內(nèi)x次的簡單校驗(yàn),高級(jí)規(guī)則需要自己改)
/** * 嘗試登錄次數(shù)限制 * login_number [日期, 次數(shù)].join('|') * 更新到數(shù)據(jù)庫 (更新數(shù)據(jù)) => {} * return { * run bool true: 超過 false: 正常 * start 登錄失敗后修改狀態(tài) * } */ exports.Login_n = (login_number, 更新到數(shù)據(jù)庫) => { 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ù)庫([getD(), 0].join('|')) } let 今天 = (n) => { 更新到數(shù)據(jù)庫([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ò)誤開始記錄
if(results[0].pw !== pw){ // 登錄失敗,更新登錄次數(shù) login_n.start() resolve({ code: 1, msg: '密碼錯(cuò)誤' }) return }
登錄完整代碼
需要引入上面的(錯(cuò)誤限制次數(shù)代碼)
這里的md5,是為了雙重加密,當(dāng)內(nèi)部員工拿到數(shù)據(jù)庫密碼后也不容易登錄, 依賴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ò)誤' }) }) })
以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
使用Nodejs?實(shí)現(xiàn)一個(gè)簡單的?Redis客戶端(推薦)
在nodejs中支持TCP連接的是net模塊,?其中使用createConnection(config)或者直接new?Socket(config)來初始化一個(gè)TCP連接,這篇文章主要介紹了用Nodejs?實(shí)現(xiàn)一個(gè)簡單的?Redis客戶端,需要的朋友可以參考下2022-11-11使用pm2部署node生產(chǎn)環(huán)境的方法步驟
這篇文章主要介紹了使用pm2部署node生產(chǎn)環(huán)境的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2019-03-03基于 Node 實(shí)現(xiàn)簡易 serve靜態(tài)資源服務(wù)器的示例詳解
靜態(tài)資源服務(wù)器(HTTP 服務(wù)器)可以將靜態(tài)文件(如 js、css、圖片)等通過 HTTP 協(xié)議展現(xiàn)給客戶端。本文介紹如何基于 Node 實(shí)現(xiàn)一個(gè)簡易的靜態(tài)資源服務(wù)器,感興趣的朋友一起看看吧2022-06-06Nodejs使用express 編寫接口的實(shí)現(xiàn)
express是一個(gè)第三方模塊,支持豐富的api,本文主要介紹了Nodejs使用express 編寫接口的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-06-06nodejs 圖解express+supervisor+ejs的用法(推薦)
下面小編就為大家?guī)硪黄猲odejs 圖解express+supervisor+ejs的用法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-09-09Node.js斷點(diǎn)續(xù)傳的實(shí)現(xiàn)
最近做了個(gè)項(xiàng)目,應(yīng)項(xiàng)目需求,需要傳圖片、Excel等,幾M的大小可以很快就上傳到服務(wù)器,但是大的就需要斷點(diǎn)上傳,本文就介紹一下,感興趣的可以了解一下2021-05-05