login.js 4.16 KB
/**
 * 登录
 * @author: Bi Kai<kai.bi@yoho.cn>
 * @date: 2016/05/09
 */
'use strict';

const library = '../../../library';
const passport = require('passport');
const md5 = require('md5');
const cookie = require(`${library}/cookie`);
const helpers = require(`${library}/helpers`);
const log = require(`${library}/logger`);
const config = require('../../../config/common');
const AuthHelper = require('../models/auth-helper');

const loginPage = `${config.siteUrl}/passport/login/index`;

function doPassportCallback(openId, nickname, sourceType, req, res) {
    let shoppingKey = cookie.getShoppingKey(req);
    let refer = req.cookies.refer;

    if (refer) {
        refer = decodeURI(req.cookies.refer);
    } else {
        refer = `${config.siteUrl}/home`;
    }

    if (/sign|login/.test(refer)) {
        refer = `${config.siteUrl}/home`;
    }
    if (openId && nickname) {
        AuthHelper.signinByOpenID(nickname, openId, sourceType, shoppingKey).then((result) => {
            if (result.data['is_bind'] && result.data['is_bind'] === 'N') { //eslint-disable-line
                return helpers.urlFormat('/passport/bind/index', {
                    openId: openId,
                    sourceType: sourceType,
                    refer: refer
                });
            } else if (result.code === 200 && result.data.uid) {
                return AuthHelper.syncUserSession(result.data.uid, req, res).then(() => {
                    return refer;
                });
            }
        }).then((redirectTo) => {
            console.log('redirectTo=', redirectTo);
            return res.redirect(redirectTo);
        }).catch((e) => {
            log.error('频道页面渲染错误:' + JSON.stringify(e));
            return res.send('error');
        });
    }
}


const local = {
    loginPage: (req, res) => {
        // 设置登录有效时间30分钟, 防机器刷,cache不稳定,改为cookie
        res.cookie('LE' + md5('_LOGIN_EXPIRE'), (new Date()).getTime() / 1000 + 1800);

        // 清除cookie
        res.clearCookie('_UID');
        res.clearCookie('_TOKEN');

        let refer = req.query.refer;

        if (!refer) {
            refer = req.get('Referer');
        }
        refer && res.cookie('refer', encodeURI(refer), {
            domain: 'yohobuy.com'
        });

        res.render('login', {
            loginIndex: true, // 模板中使用JS的标识
            backUrl: 'javascript:history.go(-1)', // 返回的URL链接
            showHeaderImg: true, // 控制显示头部图片
            isPassportPage: true, // 模板中模块标识
            registerUrl: '/reg.html', // 注册的URL链接
            aliLoginUrl: '/passport/login/alipay', // 支付宝快捷登录的URL链接
            weiboLoginUrl: '/passport/login/sina', // 微博登录的URL链接
            qqLoginUrl: '/passport/login/qq', // 腾讯QQ登录的URL链接
            internationalUrl: '/login.html', // 国际号登录的URL链接
            phoneRetriveUrl: '/passport/back/mobile', // 通过手机号找回密码的URL链接
            emailRetriveUrl: '/passport/back/email', // 通过邮箱找回密码的URL链接
            module: 'passport',
            page: 'index',
            title: '登录'
        });
    },
    login: (req, res, next) => {

    }
};

const wechat = {
    beforeLogin: (req, res, next) => {
        let refer = req.query.refer;

        if (!refer) {
            refer = req.get('Referer');
        }
        refer && res.cookie('refer', encodeURI(refer), {
            domain: 'yohobuy.com'
        });
        next();
    },
    login: (req, res, next) => {
        return passport.authenticate('weixin')(req, res, next);
    },
    callback: (req, res, next) => {
        passport.authenticate('weixin', (err, user) => {
            if (err) {
                log.error(`wechat authenticate error : ${JSON.stringify(err)}`);
                return res.redirect(loginPage);
            }
            let nickname = user.displayName || user._json.nickname;
            let openId = user.id || user._json.unionid;

            doPassportCallback(openId, nickname, 'wechat', req, res);
        })(req, res, next);
    }
};

exports.local = local;
exports.wechat = wechat;