fh-wfm-user
Version:
164 lines (147 loc) • 6.03 kB
JavaScript
;
var express = require('express');
var config = require('../config/config-user');
var userAuth = require('./mbaas-auth');
var sessionMiddleware = require('./mbaas-session-middleware');
var shortid = require('shortid');
var _ = require('lodash');
function initRouter(mediator, userProfileExclusionList, expressSessionMiddleware) {
var router = express.Router();
router.all('/auth', function(req, res) {
var params = req.body;
var userId = params && params.userId || params.username;
//If there is no userId, then we cannot authenticate.
if (!userId) {
res.status(400);
return res.json({message: 'Invalid credentials'});
}
// try to authenticate
userAuth.auth(mediator, userId, params.password)
.then(function(profileData) {
// trim the user profile data to remove specified fields when a user read from the database occurs
var authResponse = trimProfileData(profileData, userProfileExclusionList);
// on success pass relevant data into response
//Using express-session to generate and store a session.
//This is only done for authenticated requests. Otherwise we don't generate a session
//as it would cause a session to be created for every request.
return expressSessionMiddleware(req, res, function(err) {
//An error occurred while trying to create a valid session token for the user.
if (err) {
return res.status(500).json({message: "Unexpected error when creating a session. Please try again."});
}
req.session.userId = profileData.id;
return res.status(200).json({
status: 'ok',
userId: userId,
sessionToken: req.sessionID,
authResponse: authResponse
});
});
})
.catch(function(err) {
// on error pass error message into response body, assign 401 http code.
// 401 - invalid credentials (unauthorised)
res.status(401);
res.json(err.message ? err.message : 'Invalid Credentials');
});
});
router.all('/verifysession', sessionMiddleware.verifySession, function(req, res) {
res.json(req.session);
});
router.all('/revokesession', sessionMiddleware.revokeSession, function(req, res) {
res.json({});
});
router.route('/').get(function(req, res) {
mediator.once('done:wfm:user:list', function(data) {
// remove any sensitive fields from the user profile data, eg password.
_.forEach(data, function(user, index) {
data[index] = trimProfileData(user, userProfileExclusionList);
});
res.json(data);
});
mediator.publish('wfm:user:list');
});
router.route('/:id').get(function(req, res) {
var userId = req.params.id;
// remove any sensitive fields from the user profile data, eg password.
mediator.once('done:wfm:user:read:' + userId, function(data) {
data = trimProfileData(data, userProfileExclusionList);
res.json(data);
});
mediator.publish('wfm:user:read', userId);
});
router.route('/:id').put(function(req, res) {
var userId = req.params.id;
var user = req.body.user;
mediator.once('done:wfm:user:update:' + userId, function(saveduser) {
res.json(saveduser);
});
mediator.publish('wfm:user:update', user);
});
router.route('/').post(function(req, res) {
var ts = new Date().getTime();
var user = req.body.user;
user.createdTs = ts;
if (!user.id) {
user.id = shortid.generate();
}
mediator.once('done:wfm:user:create:' + user.id, function(createduser) {
res.json(createduser);
});
mediator.publish('wfm:user:create', user);
});
router.route('/:id').delete(function(req, res) {
var userId = req.params.id;
var user = req.body.user;
mediator.once('done:wfm:user:delete:' + userId, function(deleted) {
res.json(deleted);
});
mediator.publish('wfm:user:delete', user);
});
return router;
}
/**
* Function to trim the User Profile Data to prevent sensitive fields from being sent.
* By default, the password will be removed from the response.
* @param profileData {object} - the untrimmed user profile data
* @param exclusionList {array} - the array of field names to remove from the authentication response
* @return trimmedProfileData {object} - the trimmed profileData
*/
function trimProfileData(profileData, exclusionList) {
if (!exclusionList) {
// return a default auth response if the exclusion list is null or undefined
return _.omit(profileData, config.defaultProfileDataExclusionList);
}
return _.omit(profileData, exclusionList);
}
/**
* Initializes the router, mounting it in the supplied express application
* @param {Mediator} mediator Mediator instance from fh-wfm-mediator
* @param {Express.App} app Express application
* @param {Array} authResponseExclusionList List of fields in the User schema to exclude from responses
* @param {Object} sessionOptions Options for storage and express-session
* @param {Function} cb Node-style callback
*/
function init(mediator, app, authResponseExclusionList, sessionOptions, cb) {
sessionMiddleware.init(sessionOptions, function(err, result) {
if (err) {
return cb(err);
}
//Creating the express-session middleware using the redis or mongo database.
var expressSessionMiddleware = result.session({
secret: result.options.config.secret,
store: result.store,
genid: result.options.config.genid,
resave: result.options.config.resave,
saveUninitialized: result.options.config.saveUninitialized
});
//The express session is only used for authentication responses
var router = initRouter(mediator, authResponseExclusionList, expressSessionMiddleware);
app.use(config.apiPath, router);
return cb();
});
}
module.exports = {
init: init,
trimProfileData: trimProfileData
};