Skip to content

Commit c17ceeb

Browse files
author
Simon Mackie
committed
Initial commit
0 parents  commit c17ceeb

File tree

13 files changed

+1968
-0
lines changed

13 files changed

+1968
-0
lines changed

.env

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
DATABASE = nodejs-login
2+
DATABASE_HOST = localhost
3+
DATABASE_USER = root
4+
DATABASE_PASSWORD =
5+
JWT_SECRET = mysupersecretpassword
6+
JWT_EXPIRES_IN = 90d
7+
JWT_COOKIE_EXPIRES = 90

app.js

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
const express = require("express");
2+
const path = require('path');
3+
const mysql = require("mysql");
4+
const dotenv = require('dotenv');
5+
const cookieParser = require('cookie-parser');
6+
7+
dotenv.config({ path: './.env'});
8+
9+
const app = express();
10+
11+
const db = mysql.createConnection({
12+
host: process.env.DATABASE_HOST,
13+
user: process.env.DATABASE_USER,
14+
password: process.env.DATABASE_PASSWORD,
15+
database: process.env.DATABASE
16+
});
17+
18+
const publicDirectory = path.join(__dirname, './public');
19+
app.use(express.static(publicDirectory));
20+
21+
// Parse URL-encoded bodies (as sent by HTML forms)
22+
app.use(express.urlencoded({ extended: false }));
23+
// Parse JSON bodies (as sent by API clients)
24+
app.use(express.json());
25+
app.use(cookieParser());
26+
27+
app.set('view engine', 'hbs');
28+
29+
db.connect( (error) => {
30+
if(error) {
31+
console.log(error)
32+
} else {
33+
console.log("MYSQL Connected...")
34+
}
35+
})
36+
37+
//Define Routes
38+
app.use('/', require('./routes/pages'));
39+
app.use('/auth', require('./routes/auth'));
40+
41+
app.listen(5001, () => {
42+
console.log("Server started on Port 5001");
43+
})

controllers/auth.js

+136
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
const mysql = require("mysql");
2+
const jwt = require('jsonwebtoken');
3+
const bcrypt = require('bcryptjs');
4+
const { promisify } = require('util');
5+
6+
const db = mysql.createConnection({
7+
host: process.env.DATABASE_HOST,
8+
user: process.env.DATABASE_USER,
9+
password: process.env.DATABASE_PASSWORD,
10+
database: process.env.DATABASE
11+
});
12+
13+
exports.login = async (req, res) => {
14+
try {
15+
const { email, password } = req.body;
16+
17+
if( !email || !password ) {
18+
return res.status(400).render('login', {
19+
message: 'Please provide an email and password'
20+
})
21+
}
22+
23+
db.query('SELECT * FROM users WHERE email = ?', [email], async (error, results) => {
24+
console.log(results);
25+
if( !results || !(await bcrypt.compare(password, results[0].password)) ) {
26+
res.status(401).render('login', {
27+
message: 'Email or Password is incorrect'
28+
})
29+
} else {
30+
const id = results[0].id;
31+
32+
const token = jwt.sign({ id }, process.env.JWT_SECRET, {
33+
expiresIn: process.env.JWT_EXPIRES_IN
34+
});
35+
36+
console.log("The token is: " + token);
37+
38+
const cookieOptions = {
39+
expires: new Date(
40+
Date.now() + process.env.JWT_COOKIE_EXPIRES * 24 * 60 * 60 * 1000
41+
),
42+
httpOnly: true
43+
}
44+
45+
res.cookie('jwt', token, cookieOptions );
46+
res.status(200).redirect("/");
47+
}
48+
49+
})
50+
51+
} catch (error) {
52+
console.log(error);
53+
}
54+
}
55+
56+
exports.register = (req, res) => {
57+
console.log(req.body);
58+
59+
const { name, email, password, passwordConfirm } = req.body;
60+
61+
db.query('SELECT email FROM users WHERE email = ?', [email], async (error, results) => {
62+
if(error) {
63+
console.log(error);
64+
}
65+
66+
if( results.length > 0 ) {
67+
return res.render('register', {
68+
message: 'That email is already in use'
69+
})
70+
} else if( password !== passwordConfirm ) {
71+
return res.render('register', {
72+
message: 'Passwords do not match'
73+
});
74+
}
75+
76+
let hashedPassword = await bcrypt.hash(password, 8);
77+
console.log(hashedPassword);
78+
79+
db.query('INSERT INTO users SET ?', {name: name, email: email, password: hashedPassword }, (error, results) => {
80+
if(error) {
81+
console.log(error);
82+
} else {
83+
console.log(results);
84+
return res.render('register', {
85+
message: 'User registered'
86+
});
87+
}
88+
})
89+
90+
91+
});
92+
93+
}
94+
95+
exports.isLoggedIn = async (req, res, next) => {
96+
// console.log(req.cookies);
97+
if( req.cookies.jwt) {
98+
try {
99+
//1) verify the token
100+
const decoded = await promisify(jwt.verify)(req.cookies.jwt,
101+
process.env.JWT_SECRET
102+
);
103+
104+
console.log(decoded);
105+
106+
//2) Check if the user still exists
107+
db.query('SELECT * FROM users WHERE id = ?', [decoded.id], (error, result) => {
108+
console.log(result);
109+
110+
if(!result) {
111+
return next();
112+
}
113+
114+
req.user = result[0];
115+
console.log("user is")
116+
console.log(req.user);
117+
return next();
118+
119+
});
120+
} catch (error) {
121+
console.log(error);
122+
return next();
123+
}
124+
} else {
125+
next();
126+
}
127+
}
128+
129+
exports.logout = async (req, res) => {
130+
res.cookie('jwt', 'logout', {
131+
expires: new Date(Date.now() + 2*1000),
132+
httpOnly: true
133+
});
134+
135+
res.status(200).redirect('/');
136+
}

0 commit comments

Comments
 (0)