mirror of
https://github.com/cnodejs/nodeclub.git
synced 2025-12-08 19:55:55 +00:00
133 lines
4.3 KiB
JavaScript
133 lines
4.3 KiB
JavaScript
var Models = require('../models');
|
|
var User = Models.User;
|
|
var authMiddleWare = require('../middlewares/auth');
|
|
var tools = require('../common/tools');
|
|
var eventproxy = require('eventproxy');
|
|
var uuid = require('node-uuid');
|
|
var validator = require('validator');
|
|
|
|
exports.callback = function (req, res, next) {
|
|
var profile = req.user;
|
|
var email = profile.emails && profile.emails[0] && profile.emails[0].value;
|
|
if (!email) {
|
|
return res.status(500)
|
|
.render('sign/no_github_email');
|
|
}
|
|
User.findOne({githubId: profile.id}, function (err, user) {
|
|
if (err) {
|
|
return next(err);
|
|
}
|
|
// 当用户已经是 cnode 用户时,通过 github 登陆将会更新他的资料
|
|
if (user) {
|
|
user.githubUsername = profile.username;
|
|
user.githubId = profile.id;
|
|
user.githubAccessToken = profile.accessToken;
|
|
// user.loginname = profile.username;
|
|
user.avatar = profile._json.avatar_url;
|
|
user.email = email || user.email;
|
|
|
|
|
|
user.save(function (err) {
|
|
if (err) {
|
|
// 根据 err.err 的错误信息决定如何回应用户,这个地方写得很难看
|
|
if (err.message.indexOf('duplicate key error') !== -1) {
|
|
if (err.message.indexOf('loginname') !== -1) {
|
|
return res.status(500)
|
|
.send('您 GitHub 账号的用户名与之前在 CNodejs 注册的用户名重复了');
|
|
}
|
|
}
|
|
return next(err);
|
|
}
|
|
authMiddleWare.gen_session(user, res);
|
|
return res.redirect('/');
|
|
});
|
|
} else {
|
|
// 如果用户还未存在,则建立新用户
|
|
req.session.profile = profile;
|
|
return res.redirect('/auth/github/new');
|
|
}
|
|
});
|
|
};
|
|
|
|
exports.new = function (req, res, next) {
|
|
res.render('sign/new_oauth', {actionPath: '/auth/github/create'});
|
|
};
|
|
|
|
exports.create = function (req, res, next) {
|
|
var profile = req.session.profile;
|
|
|
|
var isnew = req.body.isnew;
|
|
var loginname = validator.trim(req.body.name || '').toLowerCase();
|
|
var password = validator.trim(req.body.pass || '');
|
|
var ep = new eventproxy();
|
|
ep.fail(next);
|
|
|
|
if (!profile) {
|
|
return res.redirect('/signin');
|
|
}
|
|
delete req.session.profile;
|
|
|
|
var email = profile.emails && profile.emails[0] && profile.emails[0].value;
|
|
if (!email) {
|
|
return res.status(500)
|
|
.render('sign/no_github_email');
|
|
}
|
|
if (isnew) { // 注册新账号
|
|
var user = new User({
|
|
loginname: profile.username,
|
|
pass: profile.accessToken,
|
|
email: email,
|
|
avatar: profile._json.avatar_url,
|
|
githubId: profile.id,
|
|
githubUsername: profile.username,
|
|
githubAccessToken: profile.accessToken,
|
|
active: true,
|
|
accessToken: uuid.v4(),
|
|
});
|
|
user.save(function (err) {
|
|
if (err) {
|
|
// 根据 err.err 的错误信息决定如何回应用户,这个地方写得很难看
|
|
if (err.message.indexOf('duplicate key error') !== -1) {
|
|
if (err.message.indexOf('loginname') !== -1) {
|
|
return res.status(500)
|
|
.send('您 GitHub 账号的用户名与之前在 CNodejs 注册的用户名重复了');
|
|
}
|
|
}
|
|
return next(err);
|
|
// END 根据 err.err 的错误信息决定如何回应用户,这个地方写得很难看
|
|
}
|
|
authMiddleWare.gen_session(user, res);
|
|
res.redirect('/');
|
|
});
|
|
} else { // 关联老账号
|
|
ep.on('login_error', function (login_error) {
|
|
res.status(403);
|
|
res.render('sign/signin', { error: '账号名或密码错误。' });
|
|
});
|
|
User.findOne({loginname: loginname},
|
|
ep.done(function (user) {
|
|
if (!user) {
|
|
return ep.emit('login_error');
|
|
}
|
|
tools.bcompare(password, user.pass, ep.done(function (bool) {
|
|
if (!bool) {
|
|
return ep.emit('login_error');
|
|
}
|
|
user.githubUsername = profile.username;
|
|
user.githubId = profile.id;
|
|
// user.loginname = profile.username;
|
|
user.avatar = profile._json.avatar_url;
|
|
user.githubAccessToken = profile.accessToken;
|
|
|
|
user.save(function (err) {
|
|
if (err) {
|
|
return next(err);
|
|
}
|
|
authMiddleWare.gen_session(user, res);
|
|
res.redirect('/');
|
|
});
|
|
}));
|
|
}));
|
|
}
|
|
};
|