img-captcha.js 2.6 KB
/**
 * Created by TaoHuang on 2016/6/18.
 */

'use strict';

const captchaService = require('../models/captcha-img-service');
const CAPTCHA = global.yoho.config.UNIVERSAL_CAPTCHA;
const request = require('request');
const logger = global.yoho.logger;
const CAPTCHATIME = 1 * 60000; // 默认1分钟

// 对比函数
const _mustEqual = (req) => {
    let result = req.session.captcha && (req.body.verifyCode === req.session.captcha ||
        req.body.verifyCode === CAPTCHA);

    logger.info(`img captcha auth [${result ? 'success' : 'fail'}]`,
        `CLIENT [${req.body.verifyCode}] SERVER [${req.session.captcha}]`);

    return result;
};

// 中间件
const requiredAPI = (req, res, next) => {
    let count = req.session.captchaCount;
    let time = new Date().getTime();
    let firstTime = req.session.captchaTime;

    if (count >= 4 || firstTime && (time - firstTime > CAPTCHATIME)) {
        req.session.captcha = CAPTCHA;

        return res.json({
            code: 405,
            message: '该验证码已失效,请刷新验证码',
            data: {
                needCaptcha: true
            }
        });
    }

    req.session.captchaCount = count + 1;
    if (_mustEqual(req)) {
        return next();
    } else {
        return res.json({
            code: 405,
            message: '请将图形验证码翻转至正确方向',
            data: {
                needCaptcha: true
            }
        });
    }
};

// 七牛验证码
const generate = (req, res, next) => {
    captchaService.generateCaptcha().then((result) => {
        req.session.captcha = result.data.text;
        req.session.captchaCount = 0;
        req.session.captchaTime = new Date().getTime();

        res.type('png');
        if (result.code === 200) {
            request(result.data.images).pipe(res);
        }

    }).catch(next);
};

// 端到端检查
const checkAPI = (req, res) => {
    let count = req.session.captchaCount;
    let time = new Date().getTime();
    let firstTime = req.session.captchaTime;

    if (count >= 4 || firstTime && (time - firstTime > CAPTCHATIME)) {
        req.session.captcha = CAPTCHA;

        return res.json({
            code: 405,
            message: '该验证码已失效,请刷新验证码'
        });
    }

    req.session.captchaCount = count + 1;
    if (_mustEqual(req)) {
        return res.json({
            code: 200,
            message: '验证成功'
        });
    } else {
        return res.json({
            code: 405,
            message: '请将图形验证码翻转至正确方向'
        });
    }
};

module.exports = {
    requiredAPI,
    generate,
    checkAPI
};