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.getClientInfo().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.getClientInfo().deviceId, captcha, scene }) if (payload.errCode) { throw payload } } module.exports = { getNeedCaptcha, verifyCaptcha }