You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.7 KiB
77 lines
1.7 KiB
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
|
|
}
|