validateCode.js 2.45 KB
/**
 * 验证码中间件
 * @author feng.chen<feng.chen@yoho.cn>
 * @date 2017/03/23
 */

'use strict';
const _ = require('lodash');
const config = global.yoho.config;
const co = Promise.coroutine;
const geetest = require('./geetest');
const captcha = require('./captcha');
const imgCheck = require('../models/imgcheck');

/**
 * 加载验证码
 */
const load = (req, res, next) => {
    co(function* () {
        res.locals.useGeetest = _.get(req.app.locals.wap, 'geetest.validation', false); // 使用极验证
        if (res.locals.useGeetest) {
            req.yoho.captchaShow = false;
        } else {
            let isNeedImgCheckApiData = yield req.ctx(imgCheck).isNeedImgCheck(req.sessionID);

            req.yoho.captchaShow = true;
            if (_.parseInt(_.get(isNeedImgCheckApiData, 'code')) === 200) {
                req.yoho.captchaShow = _.get(isNeedImgCheckApiData, 'data');
            }
        }

        if (_.has(res, 'locals.loadJs')) {
            res.locals.loadJs.push({
                src: global.yoho.config.geetestJs
            });
        } else {
            res.locals.loadJs = [
                {
                    src: global.yoho.config.geetestJs
                }
            ];
        }
        return next();
    })();
};

/**
 * 验证验证码
 */
const check = (req, res, next) => {
    let testCode = req.body.yohobuy;

    if (testCode === config.testCode) {
        return next();
    }

    // 默认取配置总开关来决定是否展示验证码
    req.yoho.captchaShow = !_.get(req.app.locals.wap, 'close.loginValidation', false);

    co(function* () {
        res.locals.useGeetest = _.get(req.app.locals.wap, 'geetest.validation', false); // 使用极验证
        if (res.locals.useGeetest) {
            req.yoho.captchaShow = false;
        } else {
            let isNeedImgCheckApiData = yield req.ctx(imgCheck).isNeedImgCheck(req.sessionID);

            req.yoho.captchaShow = true;
            if (_.parseInt(_.get(isNeedImgCheckApiData, 'code')) === 200) {
                req.yoho.captchaShow = _.get(isNeedImgCheckApiData, 'data');
            }
        }
        return req.yoho.captchaShow;
    })().then(function() {
        // 不是账号密码登录,直接根据配置总开关决定是否需要展示验证码
        if (!req.yoho.captchaShow) {
            return next();
        }

        return (res.locals.useGeetest ? geetest : captcha).validate(req, res, next);
    });
};

module.exports = {
    load,
    check
};