From b63f736ac6992611055cfafa450f04b49ec49991 Mon Sep 17 00:00:00 2001 From: Daniel Duque Date: Tue, 22 Oct 2019 16:29:55 +0200 Subject: [PATCH 1/5] Finished basic file structure --- views/user/signup.hbs | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 views/user/signup.hbs diff --git a/views/user/signup.hbs b/views/user/signup.hbs new file mode 100644 index 0000000000..e69de29bb2 From 91858d0e827ef19bf9f75c9719db72a1dd305d4c Mon Sep 17 00:00:00 2001 From: Daniel Duque Date: Tue, 22 Oct 2019 17:47:03 +0200 Subject: [PATCH 2/5] Initial setup done --- app.js | 2 ++ bin/www | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/app.js b/app.js index 4c4fe56e37..875b713ad1 100644 --- a/app.js +++ b/app.js @@ -12,8 +12,10 @@ const app = express(); mongoose.connect('mongodb://localhost/basic-auth', { keepAlive: true, useNewUrlParser: true, + useUnifiedTopology: true, reconnectTries: Number.MAX_VALUE }); + // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'hbs'); diff --git a/bin/www b/bin/www index cf4e2d5da3..3c1a570b1c 100755 --- a/bin/www +++ b/bin/www @@ -86,5 +86,5 @@ function onListening() { var bind = typeof addr === 'string' ? 'pipe ' + addr : 'port ' + addr.port; - debug('Listening on ' + bind); + console.log('Listening on ' + bind); } From e73fb7cd684da557aad0857aeb92f062c14bbbfd Mon Sep 17 00:00:00 2001 From: Daniel Duque Date: Tue, 22 Oct 2019 22:19:45 +0200 Subject: [PATCH 3/5] Signup, Signin finished --- app.js | 11 ++++++-- models/User.js | 13 +++++++++ routes/users.js | 64 ++++++++++++++++++++++++++++++++++++++++++ views/index.hbs | 2 +- views/user/signup.hbs | 0 views/users/signin.hbs | 9 ++++++ views/users/signup.hbs | 9 ++++++ 7 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 models/User.js create mode 100644 routes/users.js delete mode 100644 views/user/signup.hbs create mode 100644 views/users/signin.hbs create mode 100644 views/users/signup.hbs diff --git a/app.js b/app.js index 875b713ad1..38b554bb27 100644 --- a/app.js +++ b/app.js @@ -6,15 +6,19 @@ const logger = require('morgan'); const mongoose = require('mongoose'); const indexRouter = require('./routes/index'); +const usersRouter = require('./routes/users'); const app = express(); -mongoose.connect('mongodb://localhost/basic-auth', { +// Connect to database +const app_name = require('./package.json').name; +mongoose.connect(`mongodb://localhost/${app_name}`, { keepAlive: true, useNewUrlParser: true, useUnifiedTopology: true, reconnectTries: Number.MAX_VALUE -}); +}).then(data => {console.log(`Connected to Mongo!: ${data.connections[0].name}`) +}).catch(errpr => {console.log(error)}); // view engine setup app.set('views', path.join(__dirname, 'views')); @@ -27,8 +31,9 @@ app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); +app.use('/users', usersRouter); -// -- 404 and error handler +// 404 and error handler // NOTE: requires a views/not-found.ejs template app.use((req, res, next) => { diff --git a/models/User.js b/models/User.js new file mode 100644 index 0000000000..545215aecd --- /dev/null +++ b/models/User.js @@ -0,0 +1,13 @@ +const mongoose = require("mongoose"); +const Schema = mongoose.Schema; + +const userSchema = new Schema({ + username: String, + password: String +}, { + timestamps: true +}); + +const User = mongoose.model("User", userSchema); + +module.exports = User; \ No newline at end of file diff --git a/routes/users.js b/routes/users.js new file mode 100644 index 0000000000..87188f3504 --- /dev/null +++ b/routes/users.js @@ -0,0 +1,64 @@ +const express = require('express'); +const router = express.Router(); +const User = require('../models/User'); +const bcrypt = require('bcrypt'); +const bcryptSalt = 10; + +/* GET signup page. */ +router.get('/signup', (req, res, next) => { + res.render('users/signup', { title: 'Signup Form' }); +}); + +// POST signup form +router.post('/signup', (req, res, next) => { + const {username, password} = req.body; + const salt = bcrypt.genSaltSync(bcryptSalt); + const hashPass = bcrypt.hashSync(password, salt); + console.log(username,password); + User.findOne({'username': username}) + .then(user => { + if (user !== null) { + res.render('users/signup', {error: 'Username taken'}); + return; + } + if (username === "" || password === "") { + res.render('users/signup', {error: 'Enter a username and password'}); + return; + } + User.create({username, password: hashPass}) + .then(() => {res.redirect('/')}) + .catch(error => {console.log(error)}); + }) + .catch(error => {console.log(error)}); +}); + +/* GET signin page. */ +router.get('/signin', (req, res, next) => { + res.render('users/signin', { title: 'Signin Form' }); +}); + +// POST signin form +router.post('/signin', (req, res, next) => { + const {username, password} = req.body; + if (username === "" || password === "") { + res.render('users/signin', {error: 'Enter a username and password' }); + return; + } + User.findOne({'username': username}) + .then(user => { + if (!user) { + res.render('users/signin', {error: "Username doesn't exist"}) + return; + } + if (bcrypt.compareSync(password, user.password)) { + //req.session.currentUser = user; + res.redirect('/'); + } else { + res.render('users/signin', {error: "Wrong password"}) + } + }) + .catch(error => {console.log(error)}); +}) + + +module.exports = router; \ No newline at end of file diff --git a/views/index.hbs b/views/index.hbs index 1f308fdb35..bbdc953203 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -1,2 +1,2 @@

{{title}}

-

Welcome to {{title}}

+

INDEX VIEW

diff --git a/views/user/signup.hbs b/views/user/signup.hbs deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/views/users/signin.hbs b/views/users/signin.hbs new file mode 100644 index 0000000000..9edb3ba933 --- /dev/null +++ b/views/users/signin.hbs @@ -0,0 +1,9 @@ +

SIGN IN

+
+ + + + + +
+

{{error}}

\ No newline at end of file diff --git a/views/users/signup.hbs b/views/users/signup.hbs new file mode 100644 index 0000000000..3bc95ccba2 --- /dev/null +++ b/views/users/signup.hbs @@ -0,0 +1,9 @@ +

SIGN UP

+
+ + + + + +
+

{{error}}

\ No newline at end of file From e6e94949c8c2f30d2f9cca37426b2fba3879e664 Mon Sep 17 00:00:00 2001 From: Daniel Duque Date: Wed, 23 Oct 2019 00:42:38 +0200 Subject: [PATCH 4/5] done --- app.js | 38 +++++++++++++++++++++++++++----------- routes/private.js | 24 ++++++++++++++++++++++++ routes/users.js | 21 ++++++++++++--------- views/index.hbs | 10 ++++++++-- views/private/main.hbs | 4 ++++ views/private/private.hbs | 4 ++++ 6 files changed, 79 insertions(+), 22 deletions(-) create mode 100644 routes/private.js create mode 100644 views/private/main.hbs create mode 100644 views/private/private.hbs diff --git a/app.js b/app.js index 38b554bb27..fa5ecc45e1 100644 --- a/app.js +++ b/app.js @@ -1,12 +1,15 @@ -const createError = require('http-errors'); -const express = require('express'); -const path = require('path'); +const createError = require('http-errors'); +const express = require('express'); +const path = require('path'); const cookieParser = require('cookie-parser'); -const logger = require('morgan'); -const mongoose = require('mongoose'); +const logger = require('morgan'); +const mongoose = require('mongoose'); +const session = require('express-session'); +const MongoStore = require('connect-mongo')(session); -const indexRouter = require('./routes/index'); -const usersRouter = require('./routes/users'); +const indexRouter = require('./routes/index'); +const usersRouter = require('./routes/users'); +const privateRouter = require('./routes/private'); const app = express(); @@ -30,10 +33,23 @@ app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); +// Session handler +app.use(session({ + secret: app_name + "-secret", + cookie: {maxAge: 60000}, + resave: true, + saveUninitialized: true, + store: new MongoStore({ + mongooseConnection: mongoose.connection, + ttl: 24*60*60 + }) +})); + app.use('/', indexRouter); app.use('/users', usersRouter); +app.use('/private', privateRouter); -// 404 and error handler +/* 404 and error handlers */ // NOTE: requires a views/not-found.ejs template app.use((req, res, next) => { @@ -43,10 +59,10 @@ app.use((req, res, next) => { // NOTE: requires a views/error.ejs template app.use((err, req, res, next) => { - // always log the error - console.error('ERROR', req.method, req.path, err); + // Always log the error + console.error('Error: ', req.method, req.path, err); - // only render if the error ocurred before sending the response + // Only render if the error ocurred before sending the response if (!res.headersSent) { res.status(500); res.render('error'); diff --git a/routes/private.js b/routes/private.js new file mode 100644 index 0000000000..dc44591bb7 --- /dev/null +++ b/routes/private.js @@ -0,0 +1,24 @@ +const express = require('express'); +const router = express.Router(); + +router.use((req, res, next) => { + if (req.session.currentUser) { // <== if there's user in the session (user is logged in) + next(); // ==> go to the next route + } else { + res.redirect("../users/signin"); + } +}); + +// GET Main page. +router.get('/main', (req, res, next) => { + const {username} = req.session.currentUser; + res.render('private/main', {username}); +}); + +// GET Private page. +router.get('/private', (req, res, next) => { + const {username} = req.session.currentUser; + res.render('private/private', {username}); +}); + +module.exports = router; \ No newline at end of file diff --git a/routes/users.js b/routes/users.js index 87188f3504..a6d8c7ba69 100644 --- a/routes/users.js +++ b/routes/users.js @@ -1,12 +1,12 @@ const express = require('express'); -const router = express.Router(); -const User = require('../models/User'); -const bcrypt = require('bcrypt'); +const router = express.Router(); +const User = require('../models/User'); +const bcrypt = require('bcrypt'); const bcryptSalt = 10; -/* GET signup page. */ +// GET signup page. router.get('/signup', (req, res, next) => { - res.render('users/signup', { title: 'Signup Form' }); + res.render('users/signup'); }); // POST signup form @@ -14,7 +14,6 @@ router.post('/signup', (req, res, next) => { const {username, password} = req.body; const salt = bcrypt.genSaltSync(bcryptSalt); const hashPass = bcrypt.hashSync(password, salt); - console.log(username,password); User.findOne({'username': username}) .then(user => { if (user !== null) { @@ -32,9 +31,9 @@ router.post('/signup', (req, res, next) => { .catch(error => {console.log(error)}); }); -/* GET signin page. */ +// GET signin page router.get('/signin', (req, res, next) => { - res.render('users/signin', { title: 'Signin Form' }); + res.render('users/signin'); }); // POST signin form @@ -51,7 +50,7 @@ router.post('/signin', (req, res, next) => { return; } if (bcrypt.compareSync(password, user.password)) { - //req.session.currentUser = user; + req.session.currentUser = user; res.redirect('/'); } else { res.render('users/signin', {error: "Wrong password"}) @@ -60,5 +59,9 @@ router.post('/signin', (req, res, next) => { .catch(error => {console.log(error)}); }) +// GET Signout page +router.get("/signout", (req, res, next) => { + req.session.destroy((error) => {res.redirect("/users/signin")}); +}); module.exports = router; \ No newline at end of file diff --git a/views/index.hbs b/views/index.hbs index bbdc953203..8166096774 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -1,2 +1,8 @@ -

{{title}}

-

INDEX VIEW

+

INDEX

+ \ No newline at end of file diff --git a/views/private/main.hbs b/views/private/main.hbs new file mode 100644 index 0000000000..a084678ec0 --- /dev/null +++ b/views/private/main.hbs @@ -0,0 +1,4 @@ +

MAIN

+

Hello {{username}}

+Picture of a cat +Back... \ No newline at end of file diff --git a/views/private/private.hbs b/views/private/private.hbs new file mode 100644 index 0000000000..65833e456b --- /dev/null +++ b/views/private/private.hbs @@ -0,0 +1,4 @@ +

PRIVATE

+

Hello {{username}}

+Gif +Back... \ No newline at end of file From 72f1f2270f0a2b13f9982ad404f5d5830d267ed6 Mon Sep 17 00:00:00 2001 From: Daniel Duque Date: Wed, 23 Oct 2019 13:44:04 +0200 Subject: [PATCH 5/5] added basic css --- app.js | 2 +- public/stylesheets/style.css | 37 ++++++++++++++++++++++++++++++++---- routes/index.js | 2 +- routes/users.js | 6 +++--- views/index.hbs | 12 ++++-------- views/layout.hbs | 13 ++++++++++++- views/private/main.hbs | 9 +++++---- views/private/private.hbs | 9 +++++---- views/users/signin.hbs | 22 ++++++++++++--------- views/users/signup.hbs | 22 ++++++++++++--------- 10 files changed, 90 insertions(+), 44 deletions(-) diff --git a/app.js b/app.js index fa5ecc45e1..2950993e07 100644 --- a/app.js +++ b/app.js @@ -21,7 +21,7 @@ mongoose.connect(`mongodb://localhost/${app_name}`, { useUnifiedTopology: true, reconnectTries: Number.MAX_VALUE }).then(data => {console.log(`Connected to Mongo!: ${data.connections[0].name}`) -}).catch(errpr => {console.log(error)}); +}).catch(error => {console.log(error)}); // view engine setup app.set('views', path.join(__dirname, 'views')); diff --git a/public/stylesheets/style.css b/public/stylesheets/style.css index 9453385b99..9be7430694 100644 --- a/public/stylesheets/style.css +++ b/public/stylesheets/style.css @@ -1,8 +1,37 @@ body { - padding: 50px; - font: 14px "Lucida Grande", Helvetica, Arial, sans-serif; + padding: 0px; + margin: 0px; + font: 16px "Lucida Grande", Helvetica, Arial, sans-serif; } -a { - color: #00B7FF; +.body-container { + display: flex; } + +nav { + padding: 5px 20px 0px 5px; + width: 20%; + text-align: right; +} + +nav a { + text-decoration: none; + color: darkslategray; +} + +.nav-bar { + list-style-type: none; +} + +.index { + display: flex; + flex-direction: column; + padding: 30px; +} + +.btn { + border: 0px; + background-color: darkslateblue; + color: white; + padding: 8px 15px; +} \ No newline at end of file diff --git a/routes/index.js b/routes/index.js index f2d4e52ad3..84592d2225 100644 --- a/routes/index.js +++ b/routes/index.js @@ -3,7 +3,7 @@ const router = express.Router(); /* GET home page. */ router.get('/', (req, res, next) => { - res.render('index', { title: 'Express' }); + res.render('index'); }); module.exports = router; diff --git a/routes/users.js b/routes/users.js index a6d8c7ba69..a4bcb29cfd 100644 --- a/routes/users.js +++ b/routes/users.js @@ -40,20 +40,20 @@ router.get('/signin', (req, res, next) => { router.post('/signin', (req, res, next) => { const {username, password} = req.body; if (username === "" || password === "") { - res.render('users/signin', {error: 'Enter a username and password' }); + res.render('users/signin', {error: 'You must enter a username and password' }); return; } User.findOne({'username': username}) .then(user => { if (!user) { - res.render('users/signin', {error: "Username doesn't exist"}) + res.render('users/signin', {error: "That username doesn't exist"}) return; } if (bcrypt.compareSync(password, user.password)) { req.session.currentUser = user; res.redirect('/'); } else { - res.render('users/signin', {error: "Wrong password"}) + res.render('users/signin', {error: "Incorrect password"}) } }) .catch(error => {console.log(error)}); diff --git a/views/index.hbs b/views/index.hbs index 8166096774..1626cc4be9 100644 --- a/views/index.hbs +++ b/views/index.hbs @@ -1,8 +1,4 @@ -

INDEX

- \ No newline at end of file +
+

INDEX

+

Welcome

+
\ No newline at end of file diff --git a/views/layout.hbs b/views/layout.hbs index f503bd75f1..6d56f036f0 100644 --- a/views/layout.hbs +++ b/views/layout.hbs @@ -7,7 +7,18 @@ {{title}} - + + + {{{body}}} diff --git a/views/private/main.hbs b/views/private/main.hbs index a084678ec0..10c2b79897 100644 --- a/views/private/main.hbs +++ b/views/private/main.hbs @@ -1,4 +1,5 @@ -

MAIN

-

Hello {{username}}

-Picture of a cat -Back... \ No newline at end of file +
+

MAIN

+

Hello {{username}}

+ Picture of a cat +
\ No newline at end of file diff --git a/views/private/private.hbs b/views/private/private.hbs index 65833e456b..2143feb825 100644 --- a/views/private/private.hbs +++ b/views/private/private.hbs @@ -1,4 +1,5 @@ -

PRIVATE

-

Hello {{username}}

-Gif -Back... \ No newline at end of file +
+

PRIVATE

+

Hello {{username}}

+ Gif +
\ No newline at end of file diff --git a/views/users/signin.hbs b/views/users/signin.hbs index 9edb3ba933..3108d0c5e0 100644 --- a/views/users/signin.hbs +++ b/views/users/signin.hbs @@ -1,9 +1,13 @@ -

SIGN IN

-
- - - - - -
-

{{error}}

\ No newline at end of file +
+

SIGN IN

+
+ + + + + +
+
+
+

{{error}}

+
diff --git a/views/users/signup.hbs b/views/users/signup.hbs index 3bc95ccba2..9b8ee6176c 100644 --- a/views/users/signup.hbs +++ b/views/users/signup.hbs @@ -1,9 +1,13 @@ -

SIGN UP

-
- - - - - -
-

{{error}}

\ No newline at end of file +
+

SIGN UP

+
+ + + + + +
+
+
+

{{error}}

+
\ No newline at end of file