This commit is contained in:
Dobie Wollert
2014-07-25 03:00:29 -04:00
parent c63d462188
commit a403c9079f
39 changed files with 2875 additions and 3541 deletions

View File

@ -1,3 +1,5 @@
var log = require('log4node');
module.exports = function(app, passport) {
app.get('/auth', function(req, res, next) {
console.dir(req.headers);
@ -16,13 +18,15 @@ module.exports = function(app, passport) {
var options = {
callbackURL: 'http://' + req.headers['x-forwarded-host'] + '/auth/callback'
};
console.log(options);
passport.authenticate('google', options, function(err, user, info) {
var redirectUrl = '/';
if (err) { return next(err); }
if (!user) { return res.redirect('/login/error'); }
log.setPrefix("[%d] %l ");
log.info("User Logged In: %s %s", user.name.first, user.name.last);
if (req.session.redirectUrl) {
redirectUrl = req.session.redirectUrl;
req.session.redirectUrl = null;
@ -43,15 +47,22 @@ module.exports = function(app, passport) {
return {
requiresUiLogin: function(req, res, next) {
if (!req.isAuthenticated()) {
// req.session.redirectUrl = req.url;
return res.redirect('/login');
}
log.setPrefix(function(level) {
return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + req.user.name.first + ' ' + req.user.name.last + ' | ';
});
next();
},
requiresApiAccess: function(req, res, next) {
if (!req.isAuthenticated()) {
return res.send(403);
}
log.setPrefix(function(level) {
return '[' + new Date().toUTCString() + '] ' + level.toUpperCase() + ' ' + req.user.name.first + ' ' + req.user.name.last + ' | ';
});
next();
}
};

View File

@ -29,8 +29,11 @@ module.exports = {
clientId: '333768673996-8epedo3je5h59n4l97v4dv8nofs7qnee.apps.googleusercontent.com',
clientSecret: 'afu9KhKxckWJ3Tk6uxzp9Pg6',
callback: 'http://portal.atlanticbiomedical.com/auth/callback',
accessToken: 'ya29.AHES6ZT1Sj1vpgidR2I_ksLdlV_VeZUjkitnZ01cP6VRrknjUEVbuw',
refreshToken: '1/XQW9P9FNYm6jikTsV8HOIuPAo1APYhwTH5CLhq9263g'
// accessToken: 'ya29.AHES6ZT1Sj1vpgidR2I_ksLdlV_VeZUjkitnZ01cP6VRrknjUEVbuw',
// refreshToken: '1/XQW9P9FNYm6jikTsV8HOIuPAo1APYhwTH5CLhq9263g'
accessToken: 'ya29.1.AADtN_Xjt0PK6YVs8q5csiQFXQg2ZDtrVhsH6P4a5zm0mHqhGx0Nnjx4Jk68Gw',
refreshToken: '1/_5SkDLYmsi4XNaQyAzld-W5-GEqEqt5byH6VkI-j5QI',
},
email: {
user: 'api@atlanticbiomedical.com',

72
config/directory.js Normal file
View File

@ -0,0 +1,72 @@
var googleapis = require('googleapis'),
sprintf = require('sprintf'),
OAuth2Client = googleapis.OAuth2Client;
var apiClient;
module.exports = function(config) {
var oauth2Client = new OAuth2Client(
config.auth.clientId, config.auth.clientSecret, config.auth.callback);
oauth2Client.credentials = {
access_token: config.auth.accessToken,
refresh_token: config.auth.refreshToken
};
function toIsoDate(d) {
function pad(n) { return n < 10 ? '0' + n : n }
return d.getUTCFullYear()+'-'
+ pad(d.getUTCMonth()+1)+'-'
+ pad(d.getUTCDate())+'T'
+ pad(d.getUTCHours())+':'
+ pad(d.getUTCMinutes())+':'
+ pad(d.getUTCSeconds())+'Z';
}
return {
listUsers: function(callback) {
api(function(client, callback) {
var params = {
domain: 'atlanticbiomedical.com',
fields: 'users(name,primaryEmail)',
};
var request = client.admin.users.list();
request.params = params;
request.withAuthClient(oauth2Client).execute(function(err, result) {
callback(err, result);
});
}, callback);
}
};
function api(workorder, callback) {
var handler = function(client) {
workorder(client, function(err, result) {
if (oauth2Client.credentials.access_token != config.auth.accessToken) {
console.log("Updating access token");
config.auth.accessToken = oauth2Client.credentials.access_token;
}
callback(err, result);
});
};
if (apiClient) {
console.log("Using cached api client");
handler(apiClient);
} else {
console.log("Getting api client");
googleapis.discover('admin', 'directory_v1').execute(function(err, client) {
console.log(err);
if (err) return callback(err);
apiClient = client;
handler(apiClient);
});
}
}
};

View File

@ -16,17 +16,22 @@ module.exports = function(passport, config) {
passport.use(new GoogleStrategy({
clientID: config.auth.clientId,
clientSecret: config.auth.clientSecret,
// callbackURL: config.auth.callback
// callbackURL: config.auth.callback,
passReqToCallback: true
},
function(accessToken, refreshToken, profile, done) {
console.log(profile);
console.log(accessToken);
console.log(refreshToken);
function(req, accessToken, refreshToken, profile, done) {
profile = profile._json;
User.findOne({ email: profile.email.toLowerCase() }, function(err, user) {
if (err) { return done(err); }
if (!user || !user.hasPermission("system.login")) {
var source = req.headers['x-forwarded-host'];
if (
!user ||
(source == 'portal.atlanticbiomedical.com' && !user.hasPermission("system.login")) ||
(source == 'n.atlb.co' && !user.hasPermission("system.tags"))
) {
return done(null, false, { message: "You are not authorized to access this portal." });
}

View File

@ -1,5 +1,6 @@
var log = require('log4node');
module.exports = function(app, auth, piler, calendar, config) {
module.exports = function(app, auth, piler, calendar, directory, config) {
piler.addCssUrl("//fonts.googleapis.com/css?family=Open+Sans:400,300");
piler.addCssFile("/css/biomed.less");
@ -30,7 +31,7 @@ module.exports = function(app, auth, piler, calendar, config) {
app.post('/api/clients/:client_id', clients.update);
app.del('/api/clients/:client_id', clients.destroy);
var workorders = require('../app/controllers/workorders')(calendar);
var workorders = require('../app/controllers/workorders')(config, calendar);
app.get('/api/workorders', workorders.index);
app.get('/api/workorders/:workorder_id', workorders.get);
app.post('/api/workorders', workorders.create);
@ -40,8 +41,11 @@ module.exports = function(app, auth, piler, calendar, config) {
var schedule = require('../app/controllers/schedule');
app.get('/api/schedule', schedule.index);
var users = require('../app/controllers/users');
var users = require('../app/controllers/users')(config, directory);
app.get('/api/users', users.index);
app.get('/api/users/details', users.details);
app.post('/api/users', users.create);
app.post('/api/users/:user_id', users.update);
var account = require('../app/controllers/account');
app.get('/api/account', account.profile);