kongadmin
Version:
Kong admin GUI
266 lines (221 loc) • 9.11 kB
JavaScript
;
var async = require('async');
var _ = require('lodash');
var uuid = require('node-uuid');
var UserSignUp = require("../events/user-events")
/**
* Authentication Controller
*/
var AuthController = {
signup: function (req, res) {
var data = req.allParams()
var passports = data.passports
delete data.passports;
delete data.password_confirmation
// Assign activation token
data.activationToken = uuid.v4();
// Check settings as to what to do after signup
sails.models.settings
.find()
.limit(1)
.exec(function(err,settings){
if(err) return res.negotiate(err)
var _settings = settings[0].data;
if(!_settings.signup_require_activation) {
data.active = true; // Activate user automatically
}
sails.models.user
.create(data)
.exec(function (err, user) {
if (err) return res.negotiate(err)
sails.models.passport
.create({
protocol: passports.protocol,
password: passports.password,
user: user.id
}).exec(function (err, passport) {
if (err) return res.negotiate(err)
// Emit signUp event
UserSignUp.emit('user.signUp',{
user : user,
sendActivationEmail : _settings.signup_require_activation
});
return res.json(user)
})
})
})
},
activate : function (req,res) {
var token = req.param('token')
if(!token) {
return res.badRequest('Token is required.')
}
sails.models.user.findOne({
activationToken : token,
activated : false
}).exec(function (err,user) {
if(err) return res.negotiate(err)
if(!user) return res.notFound('Invalid token')
sails.models.user.update({
id:user.id
},{active:true})
.exec(function (err,updated) {
if(err) return res.negotiate(err)
return res.redirect('/#!/login?activated=' + req.param('token'))
})
})
},
/**
* Log out a user and return them to the homepage
*
* Passport exposes a logout() function on request (also aliased as logOut()) that can be
* called from any route handler which needs to terminate a login session. Invoking logout()
* will remove the request.user property and clear the login session (if any).
*
* For more information on logging out users in Passport.js, check out:
* http://passportjs.org/guide/logout/
*
* @param {Request} request Request object
* @param {Response} response Response object
*/
logout: function logout(request, response) {
request.logout();
response.json(200, true);
},
/**
* Create a third-party authentication endpoint
*
* @param {Request} request Request object
* @param {Response} response Response object
*/
provider: function provider(request, response) {
sails.services.passport.endpoint(request, response);
},
/**
* Simple action to check current auth status of user. Note that this will always send
* HTTP status 200 and actual data will contain either user object or boolean false in
* cases that user is not authenticated.
*
* @todo Hmmm, I think that this will return always false, because of missing of
* actual sessions here...
*
* @param {Request} request Request object
* @param {Response} response Response object
*/
authenticated: function authenticated(request, response) {
if (request.isAuthenticated()) {
response.json(200, request.user);
} else {
response.json(200, false);
}
},
/**
* Create a authentication callback endpoint
*
* This endpoint handles everything related to creating and verifying Passports
* and users, both locally and from third-party providers.
*
* Passport exposes a login() function on request (also aliased as logIn()) that
* can be used to establish a login session. When the login operation completes,
* user will be assigned to request.user.
*
* For more information on logging in users in Passport.js, check out:
* http://passportjs.org/guide/login/
*
* @param {Request} request Request object
* @param {Response} response Response object
*/
callback: function callback(request, response) {
sails.services.passport.callback(request, response, function callback(error, user) {
// User must be active
if(user && !user.active) {
return response.forbidden({
message : 'Account is not activated.'
});
}
request.login(user, function callback(error) {
// If an error was thrown, redirect the user to the login which should
// take care of rendering the error messages.
if (error) {
sails.log.verbose('User authentication failed');
sails.log.verbose(error);
response.json(401, error);
} else { // Upon successful login, send back user data and JWT token
response.json(200, {
user: user,
token: sails.services.token.issue(_.isObject(user.id) ? JSON.stringify(user.id) : user.id)
});
}
});
});
},
/**
* Action to check if given password is same as current user password. Note that
* this action is only allowed authenticated users. And by default given password
* is checked against to current user.
*
* @param {Request} request Request object
* @param {Response} response Response object
*/
checkPassword: function checkPassword(request, response) {
/**
* Job to fetch current user local passport data. This is needed
* to validate given password.
*
* @param {Function} next Callback function
*/
var findPassport = function findPassport(next) {
var where = {
user: request.token,
protocol: 'local'
};
sails.models.passport
.findOne(where)
.exec(function callback(error, passport) {
if (error) {
next(error);
} else if (!passport) {
next({message: 'Given authorization token is not valid'});
} else {
next(null, passport);
}
})
;
};
/**
* Job to validate given password against user passport object.
*
* @param {sails.model.passport} passport Passport object
* @param {Function} next Callback function
*/
var validatePassword = function validatePassword(passport, next) {
var password = request.param('password');
passport.validatePassword(password, function callback(error, matched) {
if (error) {
next({message: 'Invalid password'});
} else {
next(null, matched);
}
});
};
/**
* Main callback function which is called when all specified jobs are
* processed or an error has occurred while processing.
*
* @param {null|Error} error Possible error
* @param {null|boolean} result If passport was valid or not
*/
var callback = function callback(error, result) {
if (error) {
response.json(401, error);
} else if (result) {
response.json(200, result);
} else {
response.json(400, {message: 'Given password does not match.'});
}
};
// Run necessary tasks and handle results
async.waterfall([findPassport, validatePassword], callback);
}
};
module.exports = AuthController;