Browse Source

Worked on local login and registration functionality.

KrisVos130 8 years ago
parent
commit
df8f003ac8

+ 74 - 69
backend/app.js

@@ -11,7 +11,7 @@ process.env.NODE_CONFIG_DIR = `${process.cwd()}/backend/config`;
 const express          = require('express'),
       session          = require('express-session'),
       mongoose         = require('mongoose'),
-      mongoStore       = require('connect-mongo')(session),
+	  MongoStore       = require('connect-mongo')(session),
       bodyParser       = require('body-parser'),
       config           = require('config'),
       request          = require('request'),
@@ -31,81 +31,86 @@ MongoDB.on('error', (err) => {
 
 MongoDB.once('open', () => {
 	console.log('Connected to database');
+	setupExpress();
 });
+
 // setup express and socket.io
-const app = express(MongoDB);
-const server = app.listen(80);
-global.io = require('socket.io')(server);
+function setupExpress() {
+	const app = express(MongoDB);
+	const server = app.listen(80);
+	global.io = require('socket.io')(server);
 
 // other custom modules
-const coreHandler    = require('./logic/coreHandler'),
-      socketHandler  = require('./logic/socketHandler'),
-      expressHandler = require('./logic/expressHandler');
-
-global.db = {
-	user: require('./schemas/user')(mongoose),
-	station: require('./schemas/station')(mongoose)
-};
-
-app.use(passport.initialize());
-app.use(passport.session());
-
-app.use(session({
-	secret: config.get('secret'),
-	store: new mongoStore({ mongooseConnection: MongoDB }),
-	resave: true,
-	saveUninitialized: true
-}));
-
-global.io.use(passportSocketIo.authorize({
-	secret: config.get('secret'),
-	store: new mongoStore({ mongooseConnection: MongoDB })
-}));
-
-passport.serializeUser((user, done) => {
-	done(null, user);
-});
-
-passport.deserializeUser((user, done) => {
-	done(null, user);
-});
-
-passport.use('local-signup', new LocalStrategy((username, password, cb) => {
-	process.nextTick(() => {
-		global.db.user.findOne({'username' : username}, function(err, user) {
-			if (err) return cb(err);
-			if (user) return cb(null, false);
-			else {
-				let newUser = new global.db.user({
-					username
-				});
-				newUser.save(function(err) {
-					if (err) throw err;
-					return cb(null, newUser);
-				});
-			}
-		});
+	const coreHandler = require('./logic/coreHandler'),
+		socketHandler = require('./logic/socketHandler'),
+		expressHandler = require('./logic/expressHandler');
+
+	global.db = {
+		user: require('./schemas/user')(mongoose),
+		station: require('./schemas/station')(mongoose)
+	};
+
+	console.log("Test");
+	const mongoStore = new MongoStore({'mongooseConnection': MongoDB});
+
+	app.use(session({
+		secret: config.get('secret'),
+		key: 'connect.sid',
+		store: mongoStore,
+		resave: true,
+		saveUninitialized: true
+	}));
+
+	global.io.use(passportSocketIo.authorize({
+		cookieParser: require('cookie-parser'),
+		key: 'connect.sid',
+		secret: config.get('secret'),
+		store: mongoStore,
+		success: function (data, accept) {
+			console.log('successful connection to socket.io');
+
+			accept();
+		},
+		fail: function (data, message, error, accept) {
+			console.log(message);
+			if (error && message !== "Passport was not initialized")
+				throw new Error(message);
+
+			accept();
+		}
+	}));
+
+	app.use(passport.initialize());
+	app.use(passport.session());
+
+	passport.serializeUser((user, done) => {
+		done(null, user);
 	});
-}));
-
-passport.use('local-login', new LocalStrategy((username, password, cb) => {
-	process.nextTick(() => {
-		global.db.user.findOne({username}, (err, user) => {
-			if (err) return cb(err);
-			if (!user) return cb(null, false);
-			if (!user.services.token.password == password) return done(null, false);
-			return done(null, user);
-		});
+
+	passport.deserializeUser((user, done) => {
+		done(null, user);
 	});
-}));
 
+	passport.use(new LocalStrategy({usernameField: 'email'}, (email, password, done) => {
+		console.log(email, password);
+		process.nextTick(() => {
+			console.log(email, password);
+			global.db.user.findOne({"email.address": email}, (err, user) => {
+				if (err) return done(err);
+				if (!user) return done(null, false);
+				//if (!user.services.token.password == password) return done(null, false);
+				return done(null, user);
+			});
+		});
+	}));
 
-app.use(bodyParser.json());
-app.use(bodyParser.urlencoded({
-	extended: true
-}));
+	app.use(bodyParser.json());
+	app.use(bodyParser.urlencoded({
+		extended: true
+	}));
 
-app.use(express.static(__dirname + '/../frontend/build/'));
+	app.use(express.static(__dirname + '/../frontend/build/'));
 
-socketHandler(coreHandler, global.io);
-expressHandler(coreHandler, app);
+	socketHandler(coreHandler, global.io);
+	expressHandler(coreHandler, app);
+}

+ 3 - 0
backend/config/template.json

@@ -3,6 +3,9 @@
 	"apis": {
 		"youtube": {
 			"key": ""
+		},
+		"recapthca": {
+			"secret": ""
 		}
 	}
 }

+ 44 - 9
backend/logic/coreHandler.js

@@ -32,18 +32,53 @@ module.exports = {
 
 	// core route handlers
 
-	'/users/login': (user, cb) => {
-		passport.authenticate('local-login', {
-			// successRedirect: cb({ status: 'success', message: 'Successfully logged in' }),
-			// failureRedirect: cb({ status: 'error', message: 'Error while trying to log in' })
+	'/users/register': (username, email, password, recaptcha, cb) => {
+		console.log(username, password);
+		//TODO Check recaptcha
+		request({
+			url: 'https://www.google.com/recaptcha/api/siteverify',
+			method: 'POST',
+			form: {
+				'secret': config.get("apis.recapthca.secret"),
+				'response': recaptcha
+			}
+		}, function (error, response, body) {
+			console.log(error, body, error === null, JSON.parse(body).success === true);
+			if (error === null && JSON.parse(body).success === true) {
+				body = JSON.parse(body);
+				global.db.user.findOne({'username': username}, function (err, user) {
+					console.log(err, user);
+					if (err) return cb(err);
+					if (user) return cb("username");
+					else {
+						global.db.user.findOne({'email.address': email}, function (err, user) {
+							console.log(err, user);
+							if (err) return cb(err);
+							if (user) return cb("email");
+							else {
+								//TODO Email verification code, send email
+								//TODO Encrypt password
+								let newUser = new global.db.user({
+									username: username,
+									email: {
+										address: email,
+										verificationToken: "Code"
+									}
+								});
+								newUser.save(function (err) {
+									if (err) throw err;
+									return cb(null, newUser);
+								});
+							}
+						});
+					}
+				});
+			} else {
+				cb("Recaptcha failed");
+			}
 		});
 	},
 
-	'/users/register': (user, cb) => {
-		console.log(user);
-		passport.authenticate('local-signup');
-	},
-
 	'/stations': cb => {
 		cb(stations.getStations().map(function (result) {
 			return {

+ 13 - 13
backend/logic/expressHandler.js

@@ -1,25 +1,25 @@
 'use strict';
 
-module.exports = (core, app) => {
+// npm modules
+const passport  = require('passport');
 
-	app.post('/users/login', (req, res) => {
+module.exports = (core, app) => {
 
-		// TODO: Give this a better error message
-		if (!req.body.user) {
-			return res.send(JSON.stringify({ 'status': 'error', 'message': 'invalid request' }));
-		}
+	app.post('/users/login', passport.authenticate('local'), function(req, res) {
+		console.log("Test136", req.user);
+		res.json(JSON.stringify(req.user));
+		//res.end();
+	});
 
-		core['/users/login'](req.body.user, result => {
-			res.send(JSON.stringify(result));
-			console.log(JSON.stringify(result));
-		});
+	app.get('/users/logout', function(req, res) {
+		req.logout();
+		res.end();
 	});
 
-	app.post('/users/register', (req, res) => {
-		core['/users/register'](req.body.user, (result) => {
+	app.post('/users/register', function(req, res) {
+		core['/users/register'](req.body.username, req.body.email, req.body.password, req.body.recaptcha, result => {
 			res.send(JSON.stringify(result));
 		});
-		console.log('posted');
 	});
 
 	app.get('/stations', (req, res) => {

+ 4 - 10
backend/logic/socketHandler.js

@@ -12,19 +12,13 @@ module.exports = (core, io) => {
 	});
 
 	io.on('connection', socket => {
-
+		console.log("CONNECTED!");
 		socket.on('disconnect', () => {
 			console.log('User has disconnected');
 		});
 
-		socket.on('/users/login', (user, cb) => {
-			core['/users/login'](user, result => {
-				cb(result);
-			});
-		});
-
-		socket.on('/users/register', (user, cb) => {
-			core['/users/register'](user, result => {
+		socket.on('/users/register', (username, email, password, recaptcha, cb) => {
+			core['/users/register'](result => {
 				cb(result);
 			});
 		});
@@ -48,6 +42,6 @@ module.exports = (core, io) => {
 		});
 
 		// this lets the client socket know that they can start making request
-		socket.emit('ready');
+		socket.emit('ready', socket.request.user.logged_in);
 	});
 };

+ 72 - 8
frontend/components/App.vue

@@ -13,8 +13,6 @@
 	import StationBody from './StationBody.vue'
 	import MainFooter from './MainFooter.vue'
 
-	let socket = io();
-
 	export default {
 		data() {
 			return {
@@ -28,7 +26,12 @@
 					email: "",
 					username: "",
 					password: ""
-				}
+				},
+				login: {
+					email: "",
+					password: ""
+				},
+				loggedIn: true
 			}
 		},
 		methods: {
@@ -37,8 +40,27 @@
 				for (let i = 0; i < this.length; i++) {
 					this[i].visible = false;
 				}
+			},
+			logout() {
+				$.ajax({
+					method: "GET",
+					url: "/users/logout",
+					dataType: "json",
+					complete: function (msg) {
+						console.log(1, msg);
+						alert("Logged out!");
+						//do something
+						location.reload();
+					}
+				});
 			}
 		},
+		ready: function () {
+			this.socket = io();
+			this.socket.on("ready", function(loggedIn) {
+				this.loggedIn = loggedIn;
+			});
+		},
 		components: { MainHeader, HomeBody, StationBody, MainFooter },
 		events: {
 			'switchView': function(hide, show) {
@@ -47,11 +69,53 @@
 			},
 			'register': function() {
 				console.log('registered');
-				socket.emit('/users/register', {
-					email: this.register.email,
-					username: this.register.username,
-					password: this.register.password,
-					recaptcha: grecaptcha.getResponse()
+				$.ajax({
+					method: "POST",
+					url: "/users/register",
+					data: JSON.stringify({
+						email: this.register.email,
+						username: this.register.username,
+						password: this.register.password,
+						recaptcha: grecaptcha.getResponse()
+					}),
+					contentType: "application/json; charset=utf-8",
+					dataType: "json",
+					success: function (msg) {
+						console.log(1, msg);
+						alert("Registered!");
+						//do something
+					},
+					error: function (errormessage) {
+						console.log(2, errormessage);
+						alert("Not registered!");
+						//do something else
+
+					}
+				});
+			},
+			'login': function() {
+				console.log('login');
+				$.ajax({
+					method: "POST",
+					url: "/users/login",
+					data: JSON.stringify({
+						email: this.login.email,
+						password: this.login.password
+					}),
+					contentType: "application/json; charset=utf-8",
+					dataType: "json",
+					success: function (msg) {
+						console.log(1, msg);
+						alert("Logged in!");
+						//do something
+						location.reload();
+					},
+					error: function (errormessage) {
+						console.log(2, errormessage);
+						alert("Not logged in!");
+						//do something else
+
+					}
 				});
 			}
 		}

+ 18 - 1
frontend/components/HomeBody.vue

@@ -10,7 +10,7 @@
 					<input class="form-control" type="text" placeholder="Email..." v-model="$parent.register.email"/>
 					<input class="form-control" type="text" placeholder="Username..." v-model="$parent.register.username"/>
 					<input class="form-control" type="password" placeholder="Password..." v-model="$parent.register.password"/>
-					<div class="g-recaptcha" data-sitekey="6Ld5jygTAAAAAEi0E1IwovUuVFhZKctMvKnY553W"></div>
+					<div class="g-recaptcha" data-sitekey="6Lfa-wYUAAAAANY6iVvWNEXohC38l1cZqHRole9T"></div>
 				</div>
 				<div class="modal-footer">
 					<button type="button" class="btn btn-primary" data-dismiss="modal" @click="this.$dispatch('register');">Submit</button>
@@ -18,6 +18,23 @@
 			</div>
 		</div>
 	</div>
+	<div class="modal fade" id="login" tabindex="-1" role="dialog" aria-labelledby="login-modal">
+		<div class="modal-dialog" role="document">
+			<div class="modal-content">
+				<div class="modal-header">
+					<button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
+					<h4 class="modal-title">Login</h4>
+				</div>
+				<div class="modal-body">
+					<input class="form-control" type="text" placeholder="Email..." v-model="$parent.login.email"/>
+					<input class="form-control" type="password" placeholder="Password..." v-model="$parent.login.password"/>
+				</div>
+				<div class="modal-footer">
+					<button type="button" class="btn btn-primary" data-dismiss="modal" @click="this.$dispatch('login');">Submit</button>
+				</div>
+			</div>
+		</div>
+	</div>
 	<div class="group" v-for="group in groups">
 		<div class="group-title">{{group.name}}</div>
 		<div class="group-rooms">

+ 2 - 0
frontend/components/MainHeader.vue

@@ -14,7 +14,9 @@
 				<ul class="nav navbar-nav navbar-right">
 					<li><a href="#">The Project</a></li>
 					<li><a href="#">Donate</a></li>
+					<li v-if="$parent.loggedIn"><a href="#" @click="$parent.logout()">Logout</a></li>
 					<li><a href="#" data-toggle="modal" data-target="#register">Register</a></li>
+					<li><a href="#" data-toggle="modal" data-target="#login">Login</a></li>
 				</ul>
 			</div>
 		</div>