Authored by 陈轩

fix 图形验证码 5次

@@ -139,6 +139,12 @@ const setNewPasswordByEmailAPI = (req, res) => { @@ -139,6 +139,12 @@ const setNewPasswordByEmailAPI = (req, res) => {
139 * 找回密码页面-通过手机号 139 * 找回密码页面-通过手机号
140 */ 140 */
141 const indexMobilePage = (req, res, next) => { 141 const indexMobilePage = (req, res, next) => {
  142 + _.set(req.session, 'backupCaptch.verifyResult', false);
  143 +
  144 + if (req.session.captchaValidCount == null) { // eslint-disable-line
  145 + req.session.captchaValidCount = 5;
  146 + }
  147 +
142 service.getAreaDataAsync() 148 service.getAreaDataAsync()
143 .then(result => { 149 .then(result => {
144 res.render('back/mobile', Object.assign({ 150 res.render('back/mobile', Object.assign({
@@ -204,21 +210,12 @@ const sendCodeToMobileAPI = (req, res, next) => { @@ -204,21 +210,12 @@ const sendCodeToMobileAPI = (req, res, next) => {
204 } 210 }
205 } 211 }
206 212
207 - /* 如果设置了验证次数,验证是否合法,验证次数减 1;没有,设置验证次数 */  
208 - if (_.has(req.session, 'backupCaptch.useTime')) {  
209 - if (parseInt(req.session.backupCaptch.useTime, 10) <= 0) { 213 + let errorCount = _.get(req.session, 'captchaValidCount', 4); // 初始1次 + 后续4次, 同一个验证码 共5次
210 214
211 - /* 如果超过验证次数,冻结 5 分钟,更新验证次数 */  
212 - req.session.backupCaptch.timeout = Date.now() + 5 * 60 * 1000;  
213 - req.session.backupCaptch.useTime = 5;  
214 - return res.json({  
215 - code: 401,  
216 - message: '请5分钟后尝试!'  
217 - });  
218 - }  
219 - req.session.backupCaptch.useTime = req.session.backupCaptch.useTime - 1; 215 + if (!errorCount) {
  216 + _.set(req.session, 'captchaValidCount', 4);
220 } else { 217 } else {
221 - _.set(req.session, 'backupCaptch.useTime', 5); 218 + --req.session.captchaValidCount;
222 } 219 }
223 220
224 if (verifyCode) { 221 if (verifyCode) {
@@ -227,10 +224,17 @@ const sendCodeToMobileAPI = (req, res, next) => { @@ -227,10 +224,17 @@ const sendCodeToMobileAPI = (req, res, next) => {
227 if (captcha && verifyCode.toString() === captcha) { 224 if (captcha && verifyCode.toString() === captcha) {
228 req.session.backupCaptch.verifyResult = true; 225 req.session.backupCaptch.verifyResult = true;
229 } else { 226 } else {
230 - return res.json({ 227 + let jsonData = {
231 code: 400, 228 code: 400,
232 - message: '验证码输入错误'  
233 - }); 229 + message: '请将图片旋转到正确位置'
  230 + };
  231 +
  232 + if (req.session.captchaValidCount === 0) {
  233 + req.session.captcha = void 0; // 验证码 用过就扔
  234 + jsonData.changeCaptcha = true;
  235 + }
  236 +
  237 + return res.json(jsonData);
234 } 238 }
235 } else if (!req.session.backupCaptch.verifyResult) { 239 } else if (!req.session.backupCaptch.verifyResult) {
236 240
@@ -81,6 +81,10 @@ const common = { @@ -81,6 +81,10 @@ const common = {
81 81
82 const local = { 82 const local = {
83 loginPage: (req, res) => { 83 loginPage: (req, res) => {
  84 + if (req.session.captchaValidCount == null) { // eslint-disable-line
  85 + req.session.captchaValidCount = 5;
  86 + }
  87 +
84 // 先清除cookie 88 // 先清除cookie
85 // res.clearCookie('LE' + md5('_LOGIN_EXPIRE'), { 89 // res.clearCookie('LE' + md5('_LOGIN_EXPIRE'), {
86 // domain: 'yohobuy.com' 90 // domain: 'yohobuy.com'
@@ -161,14 +165,28 @@ const local = { @@ -161,14 +165,28 @@ const local = {
161 let captchaInput = req.body.captcha; 165 let captchaInput = req.body.captcha;
162 let captchaCode = _.get(req.session, 'captcha'); 166 let captchaCode = _.get(req.session, 'captcha');
163 167
164 - delete req.session.captcha; // 用过就丢弃 168 + let errorCount = _.get(req.session, 'captchaValidCount', 4); // 初始1次 + 后续4次, 同一个验证码 共5次
  169 +
  170 + if (!errorCount) {
  171 + _.set(req.session, 'captchaValidCount', 4);
  172 + } else {
  173 + --req.session.captchaValidCount;
  174 + }
165 175
166 if (!captchaInput || !captchaCode || captchaInput !== captchaCode) { 176 if (!captchaInput || !captchaCode || captchaInput !== captchaCode) {
167 - res.json({ 177 + let jsonData = {
168 code: 400, 178 code: 400,
169 message: '请将图片旋转到正确方向', 179 message: '请将图片旋转到正确方向',
170 captchaShow: true 180 captchaShow: true
171 - }); 181 + };
  182 +
  183 +
  184 + if (req.session.captchaValidCount === 0) {
  185 + req.session.captcha = void 0; // 验证码 用过就扔
  186 + jsonData.changeCaptcha = true;
  187 + }
  188 +
  189 + res.json(jsonData);
172 190
173 return; 191 return;
174 } 192 }
@@ -38,8 +38,8 @@ exports.beforeIn = (req, res, next) => { @@ -38,8 +38,8 @@ exports.beforeIn = (req, res, next) => {
38 const _step1 = (req, res, next) => { 38 const _step1 = (req, res, next) => {
39 _.set(req.session, 'smsLogin.step', 1); 39 _.set(req.session, 'smsLogin.step', 1);
40 40
41 - if (req.session.smsLogin.count == null) { // eslint-disable-line  
42 - req.session.smsLogin.count = 5; 41 + if (req.session.captchaValidCount == null) { // eslint-disable-line
  42 + req.session.captchaValidCount = 5;
43 } 43 }
44 44
45 let template = 'sms/login'; 45 let template = 'sms/login';
@@ -135,6 +135,15 @@ exports.indexCheck = (req, res, next) => { @@ -135,6 +135,15 @@ exports.indexCheck = (req, res, next) => {
135 135
136 let em = new EventEmitter(); 136 let em = new EventEmitter();
137 137
  138 +
  139 + let errorCount = _.get(req.session, 'captchaValidCount', 4 - 1); // 初始1次 + 后续4次, 同一个验证码 共5次
  140 +
  141 + if (!errorCount) {
  142 + _.set(req.session, 'captchaValidCount', 3);
  143 + } else {
  144 + --req.session.captchaValidCount;
  145 + }
  146 +
138 // 校验 成功 147 // 校验 成功
139 em.on('resolve', () => { 148 em.on('resolve', () => {
140 // 1. 将信息放入 session 149 // 1. 将信息放入 session
@@ -144,14 +153,6 @@ exports.indexCheck = (req, res, next) => { @@ -144,14 +153,6 @@ exports.indexCheck = (req, res, next) => {
144 153
145 PhoneService.sendSMS(mobile, area, 1); 154 PhoneService.sendSMS(mobile, area, 1);
146 155
147 - --req.session.smsLogin.count;  
148 -  
149 - if (!req.session.smsLogin.count) {  
150 - _.set(req.session, 'smsLogin.interval', Date.now() + 5 * 60 * 1000);  
151 - } else {  
152 - _.set(req.session, 'smsLogin.interval', Date.now() + 60 * 1000);  
153 - }  
154 -  
155 res.json({ 156 res.json({
156 code: 200, 157 code: 200,
157 redirect: '/passport/sms_login?step=2' 158 redirect: '/passport/sms_login?step=2'
@@ -160,14 +161,18 @@ exports.indexCheck = (req, res, next) => { @@ -160,14 +161,18 @@ exports.indexCheck = (req, res, next) => {
160 161
161 // 校验 失败 162 // 校验 失败
162 em.on('reject', error => { 163 em.on('reject', error => {
  164 + if (req.session.captchaValidCount === 0) {
  165 + req.session.captcha = void 0; // 验证码 用过就扔
  166 + error.changeCaptcha = true;
  167 + }
  168 +
163 _.set(req.session, 'smsLogin.step', 1); 169 _.set(req.session, 'smsLogin.step', 1);
164 170
  171 +
165 res.json(error); 172 res.json(error);
166 }); 173 });
167 174
168 175
169 - req.session.captcha = void 0; // 验证码 用过就扔  
170 -  
171 // 验证 176 // 验证
172 if ([area, mobile].some(val => val === '')) { 177 if ([area, mobile].some(val => val === '')) {
173 return em.emit('reject', {code: 400, message: '请填写手机号'}); 178 return em.emit('reject', {code: 400, message: '请填写手机号'});
@@ -84,13 +84,11 @@ $btnNext.on('touchstart', function() { @@ -84,13 +84,11 @@ $btnNext.on('touchstart', function() {
84 showErrTip(data.message); 84 showErrTip(data.message);
85 } 85 }
86 86
87 - imgCheck.refresh(); 87 + data.changeCaptcha && imgCheck.refresh();
88 } 88 }
89 }); 89 });
90 } else if (!area) { 90 } else if (!area) {
91 showErrTip('出错了,请重新刷新页面'); 91 showErrTip('出错了,请重新刷新页面');
92 - } else if (verify === '0000') {  
93 - showErrTip('请将图片旋转到正确位置');  
94 } else { 92 } else {
95 showErrTip('手机号格式不正确,请重新输入'); 93 showErrTip('手机号格式不正确,请重新输入');
96 } 94 }
@@ -97,13 +97,13 @@ $loginBtn.on('touchstart', function() { @@ -97,13 +97,13 @@ $loginBtn.on('touchstart', function() {
97 return; 97 return;
98 } 98 }
99 99
100 - if (imgCheck.atWorking) {  
101 - captcha = imgCheck.getResults(); 100 + // if (imgCheck.atWorking) {
  101 + // captcha = imgCheck.getResults();
102 102
103 - if (captcha === '0000') {  
104 - return tip.show(' 请将图片旋转到正确方向');  
105 - }  
106 - } 103 + // if (captcha === '0000') {
  104 + // return tip.show(' 请将图片旋转到正确方向');
  105 + // }
  106 + // }
107 107
108 $loginBtn.text('正在登录...').addClass('disable'); 108 $loginBtn.text('正在登录...').addClass('disable');
109 109
@@ -133,7 +133,7 @@ $loginBtn.on('touchstart', function() { @@ -133,7 +133,7 @@ $loginBtn.on('touchstart', function() {
133 $loginBtn.text('登录成功').off(); 133 $loginBtn.text('登录成功').off();
134 } else { 134 } else {
135 if (data.captchaShow) { 135 if (data.captchaShow) {
136 - imgCheck.atWorking ? imgCheck.refresh() : imgCheck.init(); 136 + imgCheck.atWorking ? (data.changeCaptcha && imgCheck.refresh()) : imgCheck.init();
137 } 137 }
138 138
139 showErrTip(data.message); 139 showErrTip(data.message);
@@ -94,10 +94,10 @@ page = { @@ -94,10 +94,10 @@ page = {
94 return; 94 return;
95 } 95 }
96 96
97 - if (captcha === '0000') {  
98 - tip.show('请将图片旋转到正确位置');  
99 - return;  
100 - } 97 + // if (captcha === '0000') {
  98 + // tip.show('请将图片旋转到正确位置');
  99 + // return;
  100 + // }
101 101
102 $nextBtn.prop('disabled', true); 102 $nextBtn.prop('disabled', true);
103 $.post('/passport/sms_login/step1_check', { 103 $.post('/passport/sms_login/step1_check', {
@@ -111,7 +111,7 @@ page = { @@ -111,7 +111,7 @@ page = {
111 $nextBtn.off(); 111 $nextBtn.off();
112 location.href = data.redirect; 112 location.href = data.redirect;
113 } else { 113 } else {
114 - imgCheck.refresh(); 114 + data.changeCaptcha && imgCheck.refresh();
115 tip.show(data.message); 115 tip.show(data.message);
116 } 116 }
117 }) 117 })