...
|
...
|
@@ -21,10 +21,17 @@ const config = global.yoho.config; |
|
|
const helpers = global.yoho.helpers;
|
|
|
const cookie = global.yoho.cookie;
|
|
|
const logger = global.yoho.logger;
|
|
|
const cache = global.yoho.cache;
|
|
|
|
|
|
let siteUrl = config.siteUrl.indexOf('//') === 0 ? 'http:' + config.siteUrl : config.siteUrl;
|
|
|
|
|
|
|
|
|
function getLoginStat(ip) {
|
|
|
let errorLoginKey = 'loginErrorIp:' + ip;
|
|
|
|
|
|
return cache.get(errorLoginKey);
|
|
|
}
|
|
|
|
|
|
// 本地登录
|
|
|
passport.use('local', new LocalStrategy({
|
|
|
usernameField: 'account',
|
...
|
...
|
@@ -33,47 +40,67 @@ passport.use('local', new LocalStrategy({ |
|
|
}, (req, username, password, done) => {
|
|
|
let area = req.body.areaCode || '86';
|
|
|
let type = req.body.loginType;
|
|
|
let clientIp = req.yoho.clientIp;
|
|
|
let errorLoginKey = 'loginErrorIp:' + clientIp;
|
|
|
|
|
|
if (isNaN(_.parseInt(area)) || _.isEmpty(username) || _.isEmpty(password)) {
|
|
|
logger.info(`【Passport Login】bad params, area:${area} account:${username} password:${password}`);
|
|
|
return done({message: '登录参数错误'}, null);
|
|
|
}
|
|
|
return getLoginStat(clientIp).then((times) => {
|
|
|
let errLoginTimes = _.parseInt(times) || 0;
|
|
|
let verifyCode = req.body.captcha;
|
|
|
|
|
|
let verifyEmail = helpers.verifyEmail(username);
|
|
|
let verifyMobile = area === '86' ? helpers.verifyAreaMobile(area + '-' + username) : true;
|
|
|
if (errLoginTimes > 0 && type !== 'SMSLogin') {
|
|
|
if (!verifyCode || verifyCode !== req.session.captcha) {
|
|
|
return done({message: '验证码不正确或验证码过期', needCaptcha: true}, null);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
if (!verifyEmail && !verifyMobile) {
|
|
|
logger.info(`【Passport Login】bad account, email:${verifyEmail} mobile:${verifyMobile}`);
|
|
|
return done({message: '登录账号格式错误'}, null);
|
|
|
}
|
|
|
|
|
|
let expire = req.cookies['LE' + md5('_LOGIN_EXPIRE')] || '';
|
|
|
if (isNaN(_.parseInt(area)) || _.isEmpty(username) || _.isEmpty(password)) {
|
|
|
logger.info(`【Passport Login】bad params, area:${area} account:${username} password:${password}`);
|
|
|
return done({message: '登录参数错误'}, null);
|
|
|
}
|
|
|
|
|
|
if (expire && expire < (new Date()).getTime() / 1000) {
|
|
|
return done({message: '页面停留时间过长,请刷新页面'}, null);
|
|
|
}
|
|
|
let verifyEmail = helpers.verifyEmail(username);
|
|
|
let verifyMobile = area === '86' ? helpers.verifyAreaMobile(area + '-' + username) : true;
|
|
|
|
|
|
let verifyCode = req.body.captcha;
|
|
|
if (!verifyEmail && !verifyMobile) {
|
|
|
logger.info(`【Passport Login】bad account, email:${verifyEmail} mobile:${verifyMobile}`);
|
|
|
return done({message: '登录账号格式错误'}, null);
|
|
|
}
|
|
|
|
|
|
if (type !== 'SMSLogin' && verifyCode && verifyCode !== req.session.captcha) {
|
|
|
return done({message: '验证码不正确或验证码过期', needCaptcha: true}, null);
|
|
|
}
|
|
|
let expire = req.cookies['LE' + md5('_LOGIN_EXPIRE')] || '';
|
|
|
|
|
|
if (expire && expire < (new Date()).getTime() / 1000) {
|
|
|
return done({message: '页面停留时间过长,请刷新页面'}, null);
|
|
|
}
|
|
|
|
|
|
let shoppingKey = cookie.getShoppingKey(req);
|
|
|
|
|
|
return LoginService.signin(type, area, username, password, shoppingKey, req).then((result) => {
|
|
|
if (result.code && result.code === 200 && result.data.uid) {
|
|
|
done(null, result.data);
|
|
|
} else {
|
|
|
done({
|
|
|
message: '请输入正确的账号或密码',
|
|
|
needCaptcha: true
|
|
|
});
|
|
|
if (type !== 'SMSLogin' && verifyCode && verifyCode !== req.session.captcha) {
|
|
|
return done({message: '验证码不正确或验证码过期', needCaptcha: true}, null);
|
|
|
}
|
|
|
|
|
|
let shoppingKey = cookie.getShoppingKey(req);
|
|
|
|
|
|
return LoginService.signin(type, area, username, password, shoppingKey, req).then((result) => {
|
|
|
if (result.code && result.code === 200 && result.data.uid) {
|
|
|
cache.del(errorLoginKey).catch(() => {});
|
|
|
done(null, result.data);
|
|
|
} else {
|
|
|
cache.set(errorLoginKey, errLoginTimes + 1, 3600).catch(() => {});
|
|
|
done({
|
|
|
message: '请输入正确的账号或密码',
|
|
|
needCaptcha: true
|
|
|
});
|
|
|
}
|
|
|
}).catch(e => {
|
|
|
logger.error('call the signin service fail,', e);
|
|
|
done('登录失败,请稍后重试', null);
|
|
|
});
|
|
|
}).catch(e => {
|
|
|
logger.error('call the signin service fail,', e);
|
|
|
done('登录失败,请稍后重试', null);
|
|
|
return done('登录失败,请稍后重试', null);
|
|
|
});
|
|
|
|
|
|
|
|
|
}));
|
|
|
|
|
|
/**
|
...
|
...
|
|