Browse Source

Basic authentication added [Not tested]

Jonathan 7 years ago
parent
commit
c87855ea41
5 changed files with 87 additions and 49 deletions
  1. 7 2
      package.json
  2. 27 8
      src/app.js
  3. 49 32
      src/logic/coreHandler.js
  4. 2 7
      src/logic/expressHandler.js
  5. 2 0
      src/logic/global.js

+ 7 - 2
package.json

@@ -10,9 +10,14 @@
     "config": "^1.21.0",
     "express": "^4.14.0",
     "express-session": "^1.14.0",
+    "passport": "^0.3.2",
+    "passport-local": "^1.0.0",
+    "passport.socketio": "^3.6.2",
     "request": "^2.74.0",
-    "socket.io": "^1.4.8",
-    "rethinkdb": "^2.3.2"
+    "rethinkdb": "^2.3.2",
+    "rethinkdbdash": "^2.3.21",
+    "session-rethinkdb": "^2.0.0",
+    "socket.io": "^1.4.8"
   },
   "devDependencies": {
     "gulp": "^3.9.1",

+ 27 - 8
src/app.js

@@ -6,12 +6,16 @@ const path = require('path'),
       os   = require('os');
 
 // npm modules
-const express    = require('express'),
-      session    = require('express-session'),
-      bodyParser = require('body-parser'),
-      config     = require('config'),
-      request    = require('request'),
-      r          = require('rethinkdb');
+const express          = require('express'),
+      session          = require('express-session'),
+      store            = require('session-rethinkdb')(session),
+      bodyParser       = require('body-parser'),
+      config           = require('config'),
+      request          = require('request'),
+      r                = require('rethinkdb'),
+      passport         = require('passport'),
+      local            = require('passport-local').Strategy,
+      passportSocketIo = require("passport.socketio");
 
 // custom modules
 const global         = require('./logic/global'),
@@ -28,11 +32,26 @@ const io = require('socket.io')(server);
 r.connect( { host: 'localhost', port: 28015, db: 'musare' }, (err, rc) => {
 	if (err) {
 		console.log(err);
-	}
-	else {
+	} else {
 
 		global.rc = rc;
 		global.io = io;
+    global.passport = passport;
+    global.localStrategy = local;
+
+    const store = new RDBStore(r);
+
+    app.use(session({
+      secret: config.get('secret'),
+      store,
+      resave: true,
+      saveUninitialized: true
+    }));
+
+    io.use(passportSocketIo.authorize({
+      secret: config.get('secret'),
+      store,
+    }));
 
 		app.use(express.static(__dirname + '/../public'));
 

+ 49 - 32
src/logic/coreHandler.js

@@ -14,12 +14,29 @@ const config    = require('config'),
 
 // custom modules
 const global    = require('./global'),
+      passport  = global.passport,
+      localStrategy  = global.localStrategy,
       stations = require('./stations');
 
 var eventEmitter = new events.EventEmitter();
 
 module.exports = {
 
+  // auth
+
+  passport.serializeUser(function(user, cb) {
+    done(null, user.id);
+  });
+
+  passport.deserializeUser(function(id, cb) {
+    r.table('users').filter({id}).run(rc, (err, cursor) => {
+      done(err, cursor.toArray().result);
+    });
+  });
+
+  app.use(passport.initialize());
+  app.use(passport.session());
+
 	// module functions
 
 	on: function (name, cb) {
@@ -32,40 +49,40 @@ module.exports = {
 
 	// core route handlers
 
-	'/users/login': function (user, cb) {
-
-		if (!user.username || !user.password) {
-			return cb({ status: 'error', message: 'Invalid login request' });
-		}
-
-		r.table('users').filter({
-			username: user.username,
-			password: crypto.createHash('md5').update(user.password).digest("hex")
-		}).run(rc, (err, cursor) => {
-			if (err) {
-				return cb({ status: 'failure', message: 'Error while fetching the user' });
-			}
-			else {
-				cursor.toArray((err, result) => {
-					if (err) {
-						return cb({ status: 'failure', message: 'Error while fetching the user' });
-					}
-					else {
-						return cb({ status: 'success', user: result });
-					}
-				});
-			}
-		});
-	},
+	'/users/login': function (user, cb) {},
 
 	'/users/register': function (user, cb) {
-
-		if (!user.email || !user.username || !user.password) {
-			return cb({ status: 'error', message: 'Invalid register request' });
-		}
-
-		// TODO: Implement register
-	},
+    passport.use('local-signup', new localStrategy({
+      usernameField : user.email,
+      passwordField : user.password,
+      passReqToCallback : true
+    }, (req, email, password, done) => {
+      process.nextTick(() => {
+        r.table('users').filter({
+    			email: user.email
+    		}).run(rc, (err, cursor) => {
+    			if (err) return done(err);
+    			else {
+    				cursor.toArray((err, result) => {
+    					if (result) {
+    						return done(null, false);
+    					} else {
+                r.table('authors').insert([{
+                  email,
+                  password: crypto.createHash('md5').update(password).digest("hex")
+                }]).run(connection, function(err, result) {
+                  if (err) throw err;
+                  return done(null, result);
+                  console.log(result);
+                });
+              }
+    				});
+    			}
+    		});
+      });
+    }));
+
+  },
 
 	'/stations': function (cb) {
 		cb(stations.getStations().map(function (result) {

+ 2 - 7
src/logic/expressHandler.js

@@ -15,15 +15,10 @@ module.exports = function (core, app) {
 	});
 
 	app.post('/users/register', function (req, res) {
-
-		// TODO: Give this a better error message
-		if (!req.body.user) {
-			return res.send(JSON.stringify({ 'status': 'error', 'message': 'invalid request' }));
-		}
-
-		core['/users/register'](req.body.user, function (result) {
+		core['/users/register'](req.body.user, (result) => {
 			res.send(JSON.stringify(result));
 		});
+		console.log('posted');
 	});
 
 	app.get('/stations', function (req, res) {

+ 2 - 0
src/logic/global.js

@@ -32,6 +32,8 @@ function Timer(callback, delay, paused) {
 module.exports = {
 	rc: null, // RethinkDB Connection, this gets set in app.js
 	io: null, // Socket.io
+	passport: null,
+	localStrategy: null,
 	htmlEntities: function(str) {
 		return String(str).replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
 	},