captcha.js
3.6 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
/**
* Created by TaoHuang on 2016/6/18.
*/
'use strict';
const _ =require('lodash');
const captchaService = require('../models/captcha-img-service');
const gtestCaptcha = require('./gee-captcha');
const helpers = global.yoho.helpers;
const CAPTCHA = 'yoho4946abcdef#$%&!@';
const request = require('request');
const logger = global.yoho.logger;
// 对比函数
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;
if (count >= 4) {
req.session.captcha = CAPTCHA;
return res.json({
code: 403,
message: '该验证码已失效'
});
}
req.session.captchaCount = count + 1;
if (_mustEqual(req)) {
return next();
} else {
return res.json({
code: 400,
message: '请将图形验证码翻转至正确方向'
});
}
};
// 重定向调用
const requiredPage = (req, res, next) => {
let count = req.session.captchaCount;
if (count >= 4) {
req.session.captcha = CAPTCHA;
return res.redirect(helpers.urlFormat('/passport/back/index'));
}
req.session.captchaCount = count + 1;
if (_mustEqual(req)) {
return next();
} else {
return res.redirect(helpers.urlFormat('/passport/back/index'));
}
};
// 生成验证码
const generate = (req, res, next) => {
captchaService.generateCaptcha().then((result) => {
req.session.captcha = result.data.text;
req.session.captchaCount = 0;
if (result.code === 200) {
return res.json({
code: result.code,
data: {
images: result.data.images
}
});
} else {
return res.json({
code: result.code,
message: result.message
});
}
}).catch(next);
};
// 七牛验证码
const generateQiniu = (req, res, next) => {
captchaService.generateCaptcha().then((result) => {
req.session.captcha = result.data.text;
req.session.captchaCount = 0;
res.type('png');
if (result.code === 200) {
request(result.data.images).pipe(res);
}
}).catch(next);
};
// 端到端检查
const checkAPI = (req, res) => {
let count = req.session.captchaCount;
if (count >= 4) {
req.session.captcha = CAPTCHA;
return res.json({
code: 403,
message: '该验证码已失效'
});
}
req.session.captchaCount = count + 1;
if (_mustEqual(req)) {
return res.json({
code: 200,
message: '验证成功'
});
} else {
return res.json({
code: 400,
message: '请将图形验证码翻转至正确方向'
});
}
};
const required = (req, res, next) => {
req.app.locals.pc = _.merge(req.app.locals.pc, {
geetest: {
validation: false
}
});
let captchaAPI = _.get(req.app.locals.pc, 'geetest.validation', false) ? gtestCaptcha.requiredAPI : requiredAPI;
if (req.body.loginType === 'password') {
return captchaAPI(req, res, next);
} else {
return next();
}
};
module.exports = {
requiredAPI,
requiredPage,
generate,
checkAPI,
generateQiniu,
required
};