密碼次數(shù)嘗試,可以有效的保護用戶賬戶安全,有了限制之后,就算用量子計算機都束手無策。
創(chuàng)新互聯(lián)公司服務項目包括瓊山網站建設、瓊山網站制作、瓊山網頁制作以及瓊山網絡營銷策劃等。多年來,我們專注于互聯(lián)網行業(yè),利用自身積累的技術優(yōu)勢、行業(yè)經驗、深度合作伙伴關系等,向廣大中小型企業(yè)、政府機構等提供互聯(lián)網行業(yè)的解決方案,瓊山網站推廣取得了明顯的社會效益與經濟效益。目前,我們服務的客戶以成都為中心已經輻射到瓊山省份的部分城市,未來相信會繼續(xù)擴大服務區(qū)域并繼續(xù)獲得客戶的支持與信任!
銀行卡也是這種,嘗試次數(shù)過多,就鎖定,說不定還會自動報警。
效果圖
實現(xiàn)思路
數(shù)據(jù)庫表設計
在表里面添加一個字段,string類型。里面包含兩個數(shù)據(jù),密碼失敗嘗試日期 和 次數(shù) 如 2019a10a23|10
這里我使用|做數(shù)據(jù)段分割,a字母做日期分割
代碼邏輯
當記錄的日期是當天,那么密碼錯誤的時候, 次數(shù)+1
當記錄的日期不是當天,那么重置
代碼封裝
這是我實現(xiàn)的簡單代碼封裝
(這里只實現(xiàn)了一天內x次的簡單校驗,高級規(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 當日登錄次數(shù) = 0
let 當日最多嘗試次數(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()){
當日登錄次數(shù) = (+n)
}
}
if(當日登錄次數(shù) >= 當日最多嘗試次數(shù)){
run = false
}
let 登錄失敗后修改狀態(tài)函數(shù) = () => {
let add_login_number
let 非當日 = () => {
更新到數(shù)據(jù)庫([getD(), 0].join('|'))
}
let 今天 = (n) => {
更新到數(shù)據(jù)庫([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: 登錄失敗后修改狀態(tài)函數(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: '賬戶異常鎖定, 請明天再試'
})
return
}密碼錯誤開始記錄
if(results[0].pw !== pw){
// 登錄失敗,更新登錄次數(shù)
login_n.start()
resolve({
code: 1,
msg: '密碼錯誤'
})
return
} 登錄完整代碼
需要引入上面的(錯誤限制次數(shù)代碼)
這里的md5,是為了雙重加密,當內部員工拿到數(shù)據(jù)庫密碼后也不容易登錄, 依賴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
}
// 次數(shù)校驗
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: '賬戶異常鎖定, 請明天再試'
})
return
}
if(results[0].pw !== pw){
// 登錄失敗,更新登錄次數(shù)
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: '以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。
網頁名稱:詳解node登錄接口之密碼錯誤限制次數(shù)(含代碼)
文章源于:http://www.chinadenli.net/article30/gpdepo.html
成都網站建設公司_創(chuàng)新互聯(lián),為您提供企業(yè)網站制作、App開發(fā)、域名注冊、電子商務、網站維護、營銷型網站建設
聲明:本網站發(fā)布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)