首次完整推送,
V:1.20240808.006
This commit is contained in:
@ -0,0 +1,76 @@
|
||||
const {
|
||||
ERROR
|
||||
} = require('../../common/error')
|
||||
|
||||
async function getNeedCaptcha ({
|
||||
uid,
|
||||
username,
|
||||
mobile,
|
||||
email,
|
||||
type = 'login',
|
||||
limitDuration = 7200000, // 两小时
|
||||
limitTimes = 3 // 记录次数
|
||||
} = {}) {
|
||||
const db = uniCloud.database()
|
||||
const dbCmd = db.command
|
||||
// 当用户最近“2小时内(limitDuration)”登录失败达到3次(limitTimes)时。要求用户提交验证码
|
||||
const now = Date.now()
|
||||
const uniIdLogCollection = db.collection('uni-id-log')
|
||||
const userIdentifier = {
|
||||
user_id: uid,
|
||||
username,
|
||||
mobile,
|
||||
email
|
||||
}
|
||||
|
||||
let totalKey = 0; let deleteKey = 0
|
||||
for (const key in userIdentifier) {
|
||||
totalKey++
|
||||
if (!userIdentifier[key] || typeof userIdentifier[key] !== 'string') {
|
||||
deleteKey++
|
||||
delete userIdentifier[key]
|
||||
}
|
||||
}
|
||||
|
||||
if (deleteKey === totalKey) {
|
||||
throw new Error('System error') // 正常情况下不会进入此条件,但是考虑到后续会有其他开发者修改此云对象,在此处做一个判断
|
||||
}
|
||||
|
||||
const {
|
||||
data: recentRecord
|
||||
} = await uniIdLogCollection.where({
|
||||
ip: this.getUniversalClientInfo().clientIP,
|
||||
...userIdentifier,
|
||||
type,
|
||||
create_date: dbCmd.gt(now - limitDuration)
|
||||
})
|
||||
.orderBy('create_date', 'desc')
|
||||
.limit(limitTimes)
|
||||
.get()
|
||||
return recentRecord.length === limitTimes && recentRecord.every(item => item.state === 0)
|
||||
}
|
||||
|
||||
async function verifyCaptcha (params = {}) {
|
||||
const {
|
||||
captcha,
|
||||
scene
|
||||
} = params
|
||||
if (!captcha) {
|
||||
throw {
|
||||
errCode: ERROR.CAPTCHA_REQUIRED
|
||||
}
|
||||
}
|
||||
const payload = await this.uniCaptcha.verify({
|
||||
deviceId: this.getUniversalClientInfo().deviceId,
|
||||
captcha,
|
||||
scene
|
||||
})
|
||||
if (payload.errCode) {
|
||||
throw payload
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
getNeedCaptcha,
|
||||
verifyCaptcha
|
||||
}
|
Reference in New Issue
Block a user