kibana-with-account
Version:
kibana-with-account is develop based kibana project
317 lines (255 loc) • 8.07 kB
JavaScript
var Joi = require('joi');
var Hoek = require('hoek');
var Async = require('async');
var Bcrypt = require('bcrypt');
var Config = require('../config');
exports.register = function (server, options, next) {
options = Hoek.applyToDefaults({basePath: ''}, options);
server.route({
method: 'POST',
path: options.basePath + '/login',
config: {
validate: {
payload: {
username: Joi.string().lowercase().required(),
password: Joi.string().required()
}
},
plugins: {
'hapi-auth-cookie': {
redirectTo: false
}
},
auth: {
mode: 'try',
strategy: 'session'
},
pre: [{
assign: 'abuseDetected',
method: function (request, reply) {
var AuthAttempt = request.server.plugins['hapi-mongo-models'].AuthAttempt;
var ip = request.info.remoteAddress;
var username = request.payload.username;
AuthAttempt.abuseDetected(ip, username, function (err, detected) {
if (err) {
return reply(err);
}
if (detected) {
return reply({
message: 'Maximum number of auth attempts reached. Please try again later.'
}).takeover().code(400);
}
reply();
});
}
}, {
assign: 'user',
method: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
var UserGroup = request.server.plugins['hapi-mongo-models'].UserGroup;
var username = request.payload.username;
var password = request.payload.password;
User.findByCredentials(username, password, function (err, user) {
if (err) {
return reply(err);
}
if (!user) {
return reply(user);
}
UserGroup.findGroupByName(user.group, function (err, result) {
if (err) {
return reply(err);
}
user.index = result.index;
reply(user);
});
});
}
}, {
assign: 'logAttempt',
method: function (request, reply) {
if (request.pre.user) {
return reply();
}
var AuthAttempt = request.server.plugins['hapi-mongo-models'].AuthAttempt;
var ip = request.info.remoteAddress;
var username = request.payload.username;
AuthAttempt.create(ip, username, function (err, authAttempt) {
if (err) {
return reply(err);
}
return reply({
message: '用户名或是密码不正确!'
}).takeover().code(400);
});
}
}, {
assign: 'session',
method: function (request, reply) {
var Session = request.server.plugins['hapi-mongo-models'].Session;
Session.create(request.pre.user._id.toString(), function (err, session) {
if (err) {
return reply(err);
}
return reply(session);
});
}
}]
},
handler: function (request, reply) {
var credentials = request.pre.session._id.toString() + ':' + request.pre.session.key;
var authHeader = 'Basic ' + new Buffer(credentials).toString('base64');
var result = {
user: {
_id: request.pre.user._id,
username: request.pre.user.username,
email: request.pre.user.email,
roles: request.pre.user.roles,
index: request.pre.user.index
},
session: request.pre.session,
authHeader: authHeader
};
request.auth.session.set(result);
reply(result);
}
});
server.route({
method: 'POST',
path: options.basePath + '/login/forgot',
config: {
validate: {
payload: {
email: Joi.string().email().lowercase().required()
}
},
pre: [{
assign: 'user',
method: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
var conditions = {
email: request.payload.email
};
User.findOne(conditions, function (err, user) {
if (err) {
return reply(err);
}
if (!user) {
return reply({message: 'Success.'}).takeover();
}
reply(user);
});
}
}]
},
handler: function (request, reply) {
var Session = request.server.plugins['hapi-mongo-models'].Session;
var User = request.server.plugins['hapi-mongo-models'].User;
var mailer = request.server.plugins.mailer;
Async.auto({
keyHash: function (done) {
Session.generateKeyHash(done);
},
user: ['keyHash', function (done, results) {
var id = request.pre.user._id.toString();
var update = {
$set: {
resetPassword: {
token: results.keyHash.hash,
expires: Date.now() + 10000000
}
}
};
User.findByIdAndUpdate(id, update, done);
}],
email: ['user', function (done, results) {
var emailOptions = {
subject: 'Reset your ' + Config.get('/projectName') + ' password',
to: request.payload.email
};
var template = 'forgot-password';
var context = {
baseHref: Config.get('/baseUrl') + '/login/reset',
email: request.payload.email,
key: results.keyHash.key
};
mailer.sendEmail(emailOptions, template, context, done);
}]
}, function (err, results) {
if (err) {
return reply(err);
}
reply({message: 'Success.'});
});
}
});
server.route({
method: 'POST',
path: options.basePath + '/login/reset',
config: {
validate: {
payload: {
key: Joi.string().required(),
email: Joi.string().email().lowercase().required(),
password: Joi.string().required()
}
},
pre: [{
assign: 'user',
method: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
var conditions = {
email: request.payload.email,
'resetPassword.expires': {$gt: Date.now()}
};
User.findOne(conditions, function (err, user) {
if (err) {
return reply(err);
}
if (!user) {
return reply({message: 'Invalid email or key.'}).takeover().code(400);
}
reply(user);
});
}
}]
},
handler: function (request, reply) {
var User = request.server.plugins['hapi-mongo-models'].User;
Async.auto({
keyMatch: function (done) {
var key = request.payload.key;
var token = request.pre.user.resetPassword.token;
Bcrypt.compare(key, token, done);
},
passwordHash: ['keyMatch', function (done, results) {
if (!results.keyMatch) {
return reply({message: 'Invalid email or key.'}).takeover().code(400);
}
User.generatePasswordHash(request.payload.password, done);
}],
user: ['passwordHash', function (done, results) {
var id = request.pre.user._id.toString();
var update = {
$set: {
password: results.passwordHash.hash
},
$unset: {
resetPassword: undefined
}
};
User.findByIdAndUpdate(id, update, done);
}]
}, function (err, results) {
if (err) {
return reply(err);
}
reply({message: 'Success.'});
});
}
});
next();
};
exports.register.attributes = {
name: 'login'
};