From dd7cc24c08ebc850e7dcc5499bbd73e7ad76e851 Mon Sep 17 00:00:00 2001 From: Alessandre Laguierce Date: Sat, 26 Oct 2024 14:43:37 +0200 Subject: [PATCH] feat: begin authentication process --- back-end/package.json | 1 + back-end/src/config/auth.config.ts | 9 ++++ ...mbers.controller.ts => auth.controller.ts} | 48 ++++++++++++++----- .../{members.route.ts => auth.route.ts} | 3 +- back-end/src/routes/index.ts | 4 +- 5 files changed, 49 insertions(+), 16 deletions(-) create mode 100644 back-end/src/config/auth.config.ts rename back-end/src/controllers/{members.controller.ts => auth.controller.ts} (66%) rename back-end/src/routes/{members.route.ts => auth.route.ts} (56%) diff --git a/back-end/package.json b/back-end/package.json index ab7c414..f6c9560 100644 --- a/back-end/package.json +++ b/back-end/package.json @@ -27,6 +27,7 @@ "dotenv": "^16.4.5", "ejs": "^3.1.10", "express": "^4.21.1", + "jose": "^5.9.6", "morgan": "^1.10.0", "pg": "^8.13.1" } diff --git a/back-end/src/config/auth.config.ts b/back-end/src/config/auth.config.ts new file mode 100644 index 0000000..87bb883 --- /dev/null +++ b/back-end/src/config/auth.config.ts @@ -0,0 +1,9 @@ +import { createSecretKey } from 'crypto'; + +const JWT_ISSUER = process.env.NODE_JWT_ISSUER as string; +const JWT_AUDIENCE = '*'; +const JWT_SECRET = process.env.NODE_JWT_SECRET as string; +const JWT_EXPIRATION = '1 week'; +const JWT_SECRET_KEY = createSecretKey(JWT_SECRET as string, 'utf-8'); + +export {JWT_ISSUER, JWT_AUDIENCE, JWT_SECRET, JWT_EXPIRATION, JWT_SECRET_KEY }; diff --git a/back-end/src/controllers/members.controller.ts b/back-end/src/controllers/auth.controller.ts similarity index 66% rename from back-end/src/controllers/members.controller.ts rename to back-end/src/controllers/auth.controller.ts index 155f665..e6544c6 100644 --- a/back-end/src/controllers/members.controller.ts +++ b/back-end/src/controllers/auth.controller.ts @@ -7,17 +7,15 @@ import { Either, eitherLeft, eitherRight } from '../utils/utils'; const defaultUser = { id_member: -1, name: "unknown" }; const defaultMember = { id_member: -1, name: "unknown", password: "none" }; -async function getMember(idOrName: number | string): Promise> { +const getMember = async (idOrName: number | string): Promise> => { const client = new_client(); await client.connect(); - console.log("BEFG"); let res; if (typeof idOrName !== 'number') { res = await client.query("SELECT * FROM membres WHERE nom_membre=$1;", [`${idOrName}`]); } else { res = await client.query("SELECT * FROM membres WHERE id_membre=$1;", [idOrName]); } - console.log("AFTG"); if (res.rows.length === 0) { await client.end(); return eitherRight("Does not exist."); @@ -28,42 +26,42 @@ async function getMember(idOrName: number | string): Promise(member); } -async function createMember(name: string, passwd: string): Promise> { +const createMember = async (name: string, passwd: string): Promise> => { const gettingMember = await getMember(name); if (!gettingMember.hasRight) { - return eitherRight("Already in database."); + return eitherRight("Already in database."); } const client = new_client(); await client.connect(); const res = await client.query("INSERT INTO membres (nom_membre, mdp_membre) VALUES ($1, $2) RETURNING *;", [`${name}`, `${passwd}`]); if (res.rows.length === 0) { await client.end(); - return eitherRight("Something went wrong"); + return eitherRight("Something went wrong"); } const member: Member = { id_member: res.rows[0].id_member, name: res.rows[0].nom_membre, password: res.rows[0].mdp_membre }; await client.end(); - return eitherLeft(member); + return eitherLeft(member); } function userAdapter(member: Member): User { return { id_member: member.id_member, name: member.name }; } + const register = (req: Request, res: Response) => { if (!req || !req.body || !req.body.name || !req.body.password) { - console.log(req.body); - res.send(req.body); + res.status(400).send(); return; } const name: string = req.body.name; bcrypt.genSalt(10, (err, salt) => { if (err) { - res.status(500); + res.status(500).send(); return; } bcrypt.hash(req.body.password, salt, async (err, hash) => { if (err) { - res.status(500); + res.status(500).send(); return; } @@ -74,6 +72,30 @@ const register = (req: Request, res: Response) => { res.send(userAdapter(member.left)); }); }); -} +}; -export { register }; +const login = async (req: Request, res: Response) => { + if (!req || !req.body || !req.body.name || !req.body.password) { + res.status(400).send(); + return; + } + const name: string = req.body.name; + const member: Either = await getMember(name); + if (member.hasRight) { + res.send(member.right).send(); + return; + } + bcrypt.compare(req.body.password, member.left.password, (err, r) => { + if (err) { + res.status(500).send(); + return; + } + if (!r) { + res.status(403).send(); + return; + } + res.status(200).send(); + }); +}; + +export { register, login }; diff --git a/back-end/src/routes/members.route.ts b/back-end/src/routes/auth.route.ts similarity index 56% rename from back-end/src/routes/members.route.ts rename to back-end/src/routes/auth.route.ts index 1c6eefd..a0c3db5 100644 --- a/back-end/src/routes/members.route.ts +++ b/back-end/src/routes/auth.route.ts @@ -1,8 +1,9 @@ import express from 'express'; -import { register } from '../controllers/members.controller'; +import { register, login } from '../controllers/auth.controller'; const router = express.Router(); router.post('/register', register); +router.post('/login', login); export default router; diff --git a/back-end/src/routes/index.ts b/back-end/src/routes/index.ts index 405db2b..7adfdf7 100644 --- a/back-end/src/routes/index.ts +++ b/back-end/src/routes/index.ts @@ -1,5 +1,5 @@ import express from 'express'; -import membersRoute from './members.route' +import authRoute from './auth.route' import db from '../db'; const routes = express.Router(); @@ -14,6 +14,6 @@ routes.get("/message", async (_req, res) => { res.render('index.ejs', { message }); }); -routes.use("/members", membersRoute); +routes.use("/auth", authRoute); export default routes;