Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 35 additions & 12 deletions app.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,28 @@
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 indexRouter = require('./routes/index');
const usersRouter = require('./routes/users');
const privateRouter = require('./routes/private');

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(error => {console.log(error)});

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'hbs');
Expand All @@ -24,9 +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) => {
Expand All @@ -36,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');
Expand Down
2 changes: 1 addition & 1 deletion bin/www
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
13 changes: 13 additions & 0 deletions models/User.js
Original file line number Diff line number Diff line change
@@ -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;
37 changes: 33 additions & 4 deletions public/stylesheets/style.css
Original file line number Diff line number Diff line change
@@ -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;
}
2 changes: 1 addition & 1 deletion routes/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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;
24 changes: 24 additions & 0 deletions routes/private.js
Original file line number Diff line number Diff line change
@@ -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;
67 changes: 67 additions & 0 deletions routes/users.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
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');
});

// 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);
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');
});

// POST signin form
router.post('/signin', (req, res, next) => {
const {username, password} = req.body;
if (username === "" || 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: "That username doesn't exist"})
return;
}
if (bcrypt.compareSync(password, user.password)) {
req.session.currentUser = user;
res.redirect('/');
} else {
res.render('users/signin', {error: "Incorrect password"})
}
})
.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;
6 changes: 4 additions & 2 deletions views/index.hbs
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
<h1>{{title}}</h1>
<p>Welcome to {{title}}</p>
<div class="index">
<h1>INDEX</h1>
<p>Welcome</p>
</div>
13 changes: 12 additions & 1 deletion views/layout.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,18 @@
<title>{{title}}</title>
<link rel="stylesheet" href="/stylesheets/style.css" />
</head>
<body>
<body class="body-container">

<nav>
<h1 class="app-name"><a href="/">Basic-Auth</a></h1>
<ul class="nav-bar">
<li><a href="/private/main">Main</a></li>
<li><a href="/private/private">Private</a></li>
<li><a href="/users/signup">Signup</a></li>
<li><a href="/users/signin">Signin</a></li>
<li><a href="/users/signout">Signout</a></li>
</ul>
</nav>

{{{body}}}

Expand Down
5 changes: 5 additions & 0 deletions views/private/main.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<div class="index">
<h1>MAIN</h1>
<p>Hello {{username}}</p>
<img src="http://placekitten.com/500/500" alt="Picture of a cat">
</div>
5 changes: 5 additions & 0 deletions views/private/private.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<div class="index">
<h1>PRIVATE</h1>
<p>Hello {{username}}</p>
<img src="https://i.imgur.com/w7vSCs9.gif" alt="Gif">
</div>
13 changes: 13 additions & 0 deletions views/users/signin.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<div class="index">
<h1>SIGN IN</h1>
<form action="/users/signin" method="POST">
<label for="username">Username</label>
<input type="text" name="username">
<label for="password" name="password">Password</label>
<input type="password" name="password">
<button type="submit" class="btn">Sign In</button>
</form>
</div>
<div class="error">
<p>{{error}}</p>
</div>
13 changes: 13 additions & 0 deletions views/users/signup.hbs
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<div class="index">
<h1>SIGN UP</h1>
<form action="/users/signup" method="POST">
<label for="username">Username</label>
<input type="text" name="username">
<label for="password" name="password">Password</label>
<input type="password" name="password">
<button type="submit" class="btn">Sign In</button>
</form>
</div>
<div class="error">
<p>{{error}}</p>
</div>