Skip to content

Commit 177ed77

Browse files
committed
feat : add auth and refresh token logic
1 parent 18d21e0 commit 177ed77

File tree

5 files changed

+112
-29
lines changed

5 files changed

+112
-29
lines changed

Backend/controllers/auth.js

+59-26
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import path from "path";
22
import { fileURLToPath } from "url";
33
import db from "../models/pgsql.js";
44
import bcrypt from "bcrypt";
5-
import nodemailer from 'nodemailer';
6-
import env from 'dotenv';
7-
import jwt from 'jsonwebtoken';
5+
import nodemailer from "nodemailer";
6+
import env from "dotenv";
7+
import jwt from "jsonwebtoken";
88

99
env.config();
1010

@@ -13,19 +13,37 @@ const __dirname = path.dirname(__filename);
1313
const views_path = path.join(__dirname, "..", "views");
1414

1515
var transporter = nodemailer.createTransport({
16-
service: 'gmail',
17-
host: 'smtp.gmail.com',
16+
service: "gmail",
17+
host: "smtp.gmail.com",
1818
port: 587,
1919
secure: false, // true for 465, false for other ports
2020
auth: {
2121
user: process.env.MAIL_ADDRESS,
22-
pass: process.env.MAIL_PASSWORD
23-
}
22+
pass: process.env.MAIL_PASSWORD,
23+
},
2424
});
2525

26-
async function verifyMail(email,token) {
26+
function generateAcessToken(id) {
27+
const token = jwt.sign({ id: id }, process.env.ACESS_TOKEN_SECRET, {
28+
expiresIn: "1h",
29+
});
30+
return token;
31+
}
32+
33+
function generateRefreshToken(email,name) {
34+
const refreshToken = jwt.sign(
35+
{ "email": email ,
36+
"name" : name
37+
},
38+
process.env.REFRESH_TOKEN_SECRET,
39+
{ expiresIn: "15d" }
40+
);
41+
return refreshToken;
42+
}
43+
44+
async function verifyMail(email, token) {
2745
// send mail with defined above transport object
28-
const link = 'http://localhost:3000/auth/token/'+token;
46+
const link = "http://localhost:3000/auth/token/" + token;
2947
const info = await transporter.sendMail({
3048
from: '"AO3" <[email protected]>', // sender address
3149
to: email, // user email address
@@ -56,12 +74,23 @@ export const post_login = (req, res) => {
5674
res.status(401).send("Invalid credentials");
5775
return;
5876
}
77+
if (result.rows[0].verified =='false') {
78+
res.status(403).send("Please verify your mail address");
79+
verifyMail(email,
80+
jwt.sign({ "email": email }, process.env.ACESS_TOKEN_SECRET, {
81+
expiresIn: "1h",
82+
}));
83+
return;
84+
}
5985
//auth sucess
6086
//add jwt token logic here
61-
res.send("authSuccess");
62-
res.redirect("/dashboard");
87+
const token = generateAcessToken(result.rows[0].id);
88+
const refreshToken = generateRefreshToken(email, result.rows[0].username);
89+
res.cookie("refreshToken", refreshToken, { httpOnly: true });
90+
res.cookie("token", token, { httpOnly: true });
91+
res.send("sucessful authentication");
92+
// res.redirect("/dashboard");
6393
});
64-
db.end();
6594
};
6695

6796
export const post_register = (req, res) => {
@@ -73,14 +102,13 @@ export const post_register = (req, res) => {
73102
if (err) {
74103
console.error(err);
75104
res.status(500).send("Server error");
76-
return;
77-
}
78-
else if (result.rowCount !== 0) {
105+
return;
106+
} else if (result.rowCount !== 0) {
79107
res.status(409).send("Email already exists");
80108
return;
81109
}
82110
// if user dosen't exist
83-
else{
111+
else {
84112
db.query(
85113
"INSERT INTO login (username,email,password) VALUES($1,$2,$3)",
86114
[username, email, password],
@@ -92,25 +120,30 @@ export const post_register = (req, res) => {
92120
}
93121
res.send("Registration successful");
94122
// Node mailer will send mail to the user
95-
verifyMail(email,jwt.sign({'email':email},process.env.ACESS_TOKEN_SECRET,{expiresIn:'1h'}));
123+
verifyMail(
124+
email,
125+
jwt.sign({ "email": email }, process.env.ACESS_TOKEN_SECRET, {
126+
expiresIn: "1h",
127+
})
128+
);
96129
}
97-
);
130+
);
98131
}
99132
});
100-
db.end();
101-
}
133+
};
102134

103-
export const get_token = (req,res) => {
135+
export const get_token = (req, res) => {
104136
const token = req.params.token;
105137
jwt.verify(token, process.env.ACESS_TOKEN_SECRET, (err, decoded) => {
106138
if (err) {
107139
res.status(403).send("Token is not valid");
108140
return;
141+
} else {
142+
db.query("UPDATE login SET verified = true WHERE email = $1;", [
143+
decoded.email,
144+
]);
145+
res.redirect("/auth/login");
146+
//add refresh token logic
109147
}
110-
res.send("Token is valid");
111-
db.query("UPDATE login SET verified = true WHERE email = $1;",[decoded.email])
112-
// res.redirect("/login");
113-
//add refresh token logic
114148
});
115149
};
116-

Backend/index.js

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import express from "express";
22
import env from "dotenv";
33
import auth from "./routes/auth.js";
44
import bodyParser from "body-parser";
5+
import cookieParser from 'cookie-parser';
6+
57

68
env.config();
79

@@ -12,6 +14,7 @@ const app = express();
1214
app.use(bodyParser.urlencoded({ extended: true }));
1315
app.use("/auth", auth);
1416
app.use(express.json());
17+
app.use(cookieParser());
1518

1619
//the following will be redirected to the dashboard for now to the login page
1720
app.get("/", (req, res) => {

Backend/views/register.html

+8-3
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,12 @@
108108
<div class="signup">
109109
<form action="/auth/register" method="post">
110110
<label for="chk" aria-hidden="true">Sign up</label>
111-
<input type="text" name="username" placeholder="User name" required="" />
111+
<input
112+
type="text"
113+
name="username"
114+
placeholder="User name"
115+
required=""
116+
/>
112117
<input type="email" name="email" placeholder="Email" required="" />
113118
<input
114119
type="password"
@@ -120,8 +125,8 @@
120125
</form>
121126
</div>
122127

123-
<div class="login" action="/auth/login" method="post">
124-
<form>
128+
<div class="login">
129+
<form action="/auth/login" method="post">
125130
<label for="chk" aria-hidden="true">Login</label>
126131
<input type="email" name="email" placeholder="Email" required="" />
127132
<input

package-lock.json

+37
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
{
2+
"dependencies": {
3+
"cookie-parser": "^1.4.6"
4+
}
5+
}

0 commit comments

Comments
 (0)