...
|
...
|
@@ -13,7 +13,7 @@ const crypto = global.yoho.crypto; |
|
|
const config = global.yoho.config;
|
|
|
|
|
|
const loginPage = `${config.siteUrl}/signin.html`;
|
|
|
const bindPage = `/xianyu/passport/bind`;
|
|
|
const homePage = `${config.siteUrl}/xianyu/channel`;
|
|
|
|
|
|
// taobao 登录
|
|
|
passport.use('taobao', new TaobaoStrategy({
|
...
|
...
|
@@ -25,7 +25,7 @@ passport.use('taobao', new TaobaoStrategy({ |
|
|
done(null, profile);
|
|
|
}));
|
|
|
|
|
|
class signModel extends global.yoho.BaseModel {
|
|
|
class passportModel extends global.yoho.BaseModel {
|
|
|
constructor(ctx) {
|
|
|
super(ctx);
|
|
|
}
|
...
|
...
|
@@ -41,10 +41,7 @@ class signModel extends global.yoho.BaseModel { |
|
|
param.business_line = businessLine;
|
|
|
}
|
|
|
|
|
|
return this.get({ data: param }).then(res => {
|
|
|
console.log(res);
|
|
|
return res;
|
|
|
});
|
|
|
return this.get({ data: param });
|
|
|
}
|
|
|
syncUserSession({uid, sessionKey, req, res}) {
|
|
|
let userId = {
|
...
|
...
|
@@ -106,10 +103,30 @@ class signModel extends global.yoho.BaseModel { |
|
|
});
|
|
|
});
|
|
|
}
|
|
|
sendTaobaoBindCode(mobile) {
|
|
|
return this.post({
|
|
|
data: {
|
|
|
method: 'app.bind.sendCodeByTB',
|
|
|
source_type: 'taobao',
|
|
|
mobile
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
bindTaobaoAccountByCode({ mobile, code, openId }) {
|
|
|
return this.post({
|
|
|
data: {
|
|
|
method: 'app.bind.bindTBByCode',
|
|
|
source_type: 'taobao',
|
|
|
mobile,
|
|
|
code,
|
|
|
open_id: openId
|
|
|
}
|
|
|
});
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const login = {
|
|
|
taobaoLogin: (req, res, next) => {
|
|
|
taobaoLogin(req, res, next) {
|
|
|
req.session.authState = uuid.v4();
|
|
|
|
|
|
return passport.authenticate('taobao', {
|
...
|
...
|
@@ -117,14 +134,14 @@ const login = { |
|
|
failWithError: true
|
|
|
})(req, res, next);
|
|
|
},
|
|
|
taobaoCallback: (req, res, next) => {
|
|
|
taobaoCallback(req, res, next) {
|
|
|
passport.authenticate('taobao', (err, user) => {
|
|
|
if (err || !user) {
|
|
|
log.error(`taobao authenticate error : ${JSON.stringify(err)}`);
|
|
|
return res.redirect(loginPage);
|
|
|
}
|
|
|
|
|
|
const model = req.ctx(signModel);
|
|
|
console.log(user);
|
|
|
const model = req.ctx(passportModel);
|
|
|
|
|
|
return model.signinByOpenID({
|
|
|
openId: user.open_uid,
|
...
|
...
|
@@ -134,11 +151,9 @@ const login = { |
|
|
|
|
|
if (result.code === 200) {
|
|
|
if (_.get(result, 'data.is_bind') === 'N') {
|
|
|
redirectUrl = req.cookies.third_backurl ? url.parse(req.cookies.third_backurl) : '/xianyu/passport/bind';
|
|
|
|
|
|
if (redirectUrl.indexOf('?')) {
|
|
|
redirectUrl += '&bind_code' + crypto.dynamicEncryption(user.open_uid);
|
|
|
}
|
|
|
redirectUrl = req.cookies.third_backurl ? url.parse(req.cookies.third_backurl) : homePage;
|
|
|
redirectUrl += redirectUrl.indexOf('?') > 0 ? '&' : '?';
|
|
|
redirectUrl += 'bind_code=' + encodeURIComponent(aes.dynamicEncryption(`taobao::${user.open_uid}`));
|
|
|
} else if (+_.get(result, 'data.uid') > 0) {
|
|
|
return model.syncUserSession({
|
|
|
uid: result.data.uid,
|
...
|
...
|
@@ -146,7 +161,7 @@ const login = { |
|
|
req,
|
|
|
res
|
|
|
}).finally(() => {
|
|
|
let refer = req.cookies.third_backurl ? url.parse(req.cookies.third_backurl) : '';
|
|
|
let refer = req.cookies.third_backurl ? url.parse(req.cookies.third_backurl) : homePage;
|
|
|
|
|
|
return res.redirect(refer);
|
|
|
});
|
...
|
...
|
@@ -157,8 +172,74 @@ const login = { |
|
|
})
|
|
|
})(req, res, next);
|
|
|
}
|
|
|
};
|
|
|
|
|
|
const bind = {
|
|
|
getBindThirdInfo(bindCode) {
|
|
|
let info = aes.dynamicDecrypt(bindCode);
|
|
|
let bindInfo = {
|
|
|
timestamp: info.timestamp
|
|
|
};
|
|
|
|
|
|
if (info.val) {
|
|
|
let splitArr = info.val.split('::');
|
|
|
|
|
|
bindInfo.type = splitArr[0];
|
|
|
bindInfo.openId = splitArr[1];
|
|
|
}
|
|
|
|
|
|
return bindInfo;
|
|
|
},
|
|
|
sendSms(req, res, next) {
|
|
|
let { mobile, bindCode } = req.body || {};
|
|
|
console.log(this)
|
|
|
let info = bind.getBindThirdInfo(bindCode);
|
|
|
|
|
|
if (info.type === 'taobao') {
|
|
|
req.ctx(passportModel).sendTaobaoBindCode(mobile).then(res.json).catch(next);
|
|
|
} else {
|
|
|
res.json({
|
|
|
code: 200,
|
|
|
message: `${info.type || ''} not found`
|
|
|
});
|
|
|
}
|
|
|
},
|
|
|
bindByCode(req, res, next) {
|
|
|
let { mobile, code, bindCode } = req.body || {};
|
|
|
let info = bind.getBindThirdInfo(bindCode);
|
|
|
|
|
|
if (info.type === 'taobao') {
|
|
|
const model = req.ctx(passportModel);
|
|
|
|
|
|
model.bindTaobaoAccountByCode({
|
|
|
mobile,
|
|
|
code,
|
|
|
openId: info.openId
|
|
|
}).then(result => {
|
|
|
if (_.get(result, 'data.is_bind') === 'Y') {
|
|
|
model.syncUserSession({
|
|
|
uid: result.data.uid,
|
|
|
sessionKey: result.data.session_key,
|
|
|
req,
|
|
|
res
|
|
|
}).finally(() => {
|
|
|
delete result.data;
|
|
|
res.json(result);
|
|
|
});
|
|
|
} else {
|
|
|
res.json(result);
|
|
|
}
|
|
|
}).catch(next);
|
|
|
} else {
|
|
|
res.json({
|
|
|
code: 400,
|
|
|
message: '登录失败请稍后重试'
|
|
|
});
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
module.exports = {
|
|
|
login
|
|
|
login,
|
|
|
bind
|
|
|
}; |
...
|
...
|
|