12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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
- }
|