UNPKG

lcars-library-node

Version:

NodeJS module for creating a library for the LCARS dashboard system

205 lines (186 loc) 5.22 kB
var express = require("express"); var passport = require("passport"); var Strategy = require("passport-google-oauth20").Strategy; var configuration = require("a-configuration"); var Session = require("./session"); var User = require("./user"); var extractProfile = function(profile) { var image = "none"; if (profile.photos && profile.photos.length) { image = profile.photos[0].value; } var email = "none"; if(profile.emails) { for(var x=0;x<profile.emails.length;x++) { email = profile.emails[x].value; if(profile.emails[x].type === "account") { break; } } } return { "id": profile.id, "display": profile.displayName, "image": image, "email": email }; }; passport.use(new Strategy({ "clientID": configuration.passport.OAUTH2_CLIENT_ID, "clientSecret": configuration.passport.OAUTH2_CLIENT_SECRET, "callbackURL": configuration.passport.OAUTH2_CALLBACK, "accessType": "offline" }, function (req, accessToken, refreshToken, profile, done) { var now = Date.now(); var session = random.string(128) + btoa(random.string(16) + req + now); var connector = random.string(32); var user = extractProfile(profile); User.findOne({"gmail": user.email}) .then(function(rsuser) { console.log("User Retrieved:\n", rsuser); if(!rsuser) { rsuser = new User({ "name": user.display, "image": user.image, "username": user.email, "gmail": user.email, "email": user.email, "contact": "mailto:" + user.email, "sessions": [], "ips": [] }); } session = new Session({ "username": rsuser.username, "source": req, "ips": [], "authenticated": now, "authenticator": session, "connector": connector, "last": now, "user": rsuser._id }); session.save() .then(function(saved) { console.log("Session Saved..."); rsuser.sessions.push(saved._id); rsuser.save() .then(function() { console.log("User Saved..."); done(null, {"session": session, "user": rsuser}); console.log("...Done"); }); }); }) .catch(function(err) { done(err, user); }); }) ); passport.serializeUser(function(req, processing, done) { req._session = processing.session; req._session.srcip = req.ip; req._session.save(); if(processing.user.ips.indexOf(req.ip) === -1) { processing.user.ips.push(req.ip); processing.user.save(); } done(null, req._session); }); passport.deserializeUser(function(user, done) { done(null, user); }); var passport = passport; var passportIn = passport.authenticate("google", { scope: ["email", "profile"] }); var passportBack = passport.authenticate("google", { scope: ["email", "profile"], failureRedirect: "https://refugesystems.net/#/?login=" }); var passportIncoming = function(req, res, next) { console.log("Passport Incoming..."); next(); }; var passportProcess = function(req, res, next) { console.log("Passport Processing:\n", req.originalUrl); next(); }; var finalize = function(req, res, next) { if(req._session) { console.log("Finalizing Processing:\n", req._session); res.redirect("https://refugesystems.net/#/?login=" + req._session.connector); } }; var connect = function(req, res, next) { var connector = req.body.login || req.query.login; Session.findOne({"connector":connector}) .then(function(session) { if(session) { session.connector = undefined; session.save() .then(function() { res.json({"session": session.authenticator}); }); } else { next({ "message": "Session not found. Either already consumed, or bad request", "code": 1, "status": 401 }); } }) .catch(next); }; /** * Middleware for validating user access to the requested resource. * @method authorization * @type Middleware */ var authorize = function(req, res, next) { var authenticator = req.get("x-authenticator"); if(authenticator) { Session.findOne({"id":authenticator}) .then(function(session) { if(session) { var now = Date.now(); if(now - session.last >= configuration.passport.ttl) { // TODO: Instead of removing, Queue for final security review once Ares exists Session.remove({"id":authenticator}) .then(function() { next(); }); } else { session.ips = session.ips || []; if(session.ips.indexOf(req.ip) === -1) { session.ips.push(req.ip); } session.last = now; req._session = session; session.save() .then(function() { next(); }); } } else { next(); } }) .catch(next); } else { next(); } }; var signOut = function(req, res, next) { var session = req._session || {"id":"1"}; Session.remove({"id":session.authenticator}) .then(function(removed) { res.json({ "message": "Session deleted" }); }) .catch(next); }; var router = express.Router(); router.use(passport.initialize()); router.get("/google" , passportIn); router.post("/google", passportIn); router.get("/google/callback" , passportBack); router.post("/google/callback", passportBack); router.use(finalize); module.exports = router;