Authored by 周少峰

Merge branch 'hotfix/blkqqlogin'

... ... @@ -6,6 +6,9 @@
'use strict';
const _ = require('lodash');
const Fp = require('lodash/fp');
const qs = require('querystring');
const passport = require('passport');
const uuid = require('uuid');
const md5 = require('md5');
... ... @@ -29,7 +32,7 @@ function doPassportCallback(req, res, user) {
if (/sign|login/.test(refer)) {
refer = config.siteUrl;
}
if (user.openId && user.nickname) {
if (user.openId) {
let signinByOpenID;
if (user.sourceType === 'wechat') {
... ... @@ -80,7 +83,7 @@ const common = {
},
needCaptcha: (req, res, next) => {
let account = req.query.account;
let result = { code: 400, message: '', data: '' };
let result = {code: 400, message: '', data: ''};
if (account) {
let errorLoginKey = 'account_errorlogin_' + account;
... ... @@ -88,7 +91,7 @@ const common = {
cache.get(errorLoginKey).then(errloginTimes => {
errloginTimes = parseInt(errloginTimes, 0) || 0;
if (!isNaN(errloginTimes) && errloginTimes >= 3) {
result.data = { needCaptcha: true };
result.data = {needCaptcha: true};
}
res.json(result);
}).catch(next);
... ... @@ -278,12 +281,18 @@ const sina = {
const qq = {
login: (req, res, next) => {
req.session = req.session || {};
req.session.authState = uuid.v4();
let type = req.query.type || 'yohobuy';
let authState = req.session.authState = (req.query.state || uuid.v4()) + '::' + type;
return passport.authenticate('qq', {
state: req.session.authState
state: authState
})(req, res, next);
},
callback: (req, res, next) => {
let auth = Fp.compose(Fp.head, Fp.split('::'))(req.query.state);
let type = Fp.compose(Fp.nth(1), Fp.split('::'))(req.query.state);
if (req.session && req.session.authState && req.session.authState === req.query.state) {
passport.authenticate('qq', (err, user) => {
if (err) {
... ... @@ -293,11 +302,16 @@ const qq = {
let nickname = _.trim(user.nickname);
let openId = user.id;
doPassportCallback(req, res, {
openId: openId,
nickname: nickname,
sourceType: 'qq'
}).catch(next);
if (type === 'yohoblk') {
return res.redirect('//www.yohoblk.com/passport/login/qq/callback?' +
qs.stringify({openid: openId, nickname: nickname, state: auth}));
} else {
doPassportCallback(req, res, {
openId: openId,
nickname: nickname,
sourceType: 'qq'
}).catch(next);
}
})(req, res, next);
} else {
return next(new Error('Auth State Mismatch'));
... ...