validateCode.js 1.85 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 imgCheck = require('../models/imgcheck');

/**
 * 加载验证码
 */
const load = (req, res, next) => {
    co(function* () {
        let isNeedImgCheckApiData = yield req.ctx(imgCheck).isNeedImgCheck(req.cookies.udid);

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

        res.locals.useGeetest = !req.yoho.captchaShow;

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

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

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

    co(function* () {
        let isNeedImgCheckApiData = yield req.ctx(imgCheck).isNeedImgCheck(req.cookies.udid);

        req.yoho.captchaShow = true;
        if (_.parseInt(_.get(isNeedImgCheckApiData, 'code')) === 200) {
            req.yoho.captchaShow = _.get(isNeedImgCheckApiData, 'data');
        } else {
            req.yoho.captchaShow = false;
        }
        res.locals.useGeetest = !req.yoho.captchaShow;
        return res.locals.useGeetest;
    })().then(function() {
        return res.locals.useGeetest ? geetest.validate(req, res, next) : next();
    });
};

module.exports = {
    load,
    check
};