feat: begin authentication process

This commit is contained in:
Alessandre Laguierce 2024-10-26 14:43:37 +02:00
parent 8b74c22a10
commit dd7cc24c08
5 changed files with 49 additions and 16 deletions

View File

@ -27,6 +27,7 @@
"dotenv": "^16.4.5", "dotenv": "^16.4.5",
"ejs": "^3.1.10", "ejs": "^3.1.10",
"express": "^4.21.1", "express": "^4.21.1",
"jose": "^5.9.6",
"morgan": "^1.10.0", "morgan": "^1.10.0",
"pg": "^8.13.1" "pg": "^8.13.1"
} }

View File

@ -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 };

View File

@ -7,17 +7,15 @@ import { Either, eitherLeft, eitherRight } from '../utils/utils';
const defaultUser = { id_member: -1, name: "unknown" }; const defaultUser = { id_member: -1, name: "unknown" };
const defaultMember = { id_member: -1, name: "unknown", password: "none" }; const defaultMember = { id_member: -1, name: "unknown", password: "none" };
async function getMember(idOrName: number | string): Promise<Either<Member, string>> { const getMember = async (idOrName: number | string): Promise<Either<Member, string>> => {
const client = new_client(); const client = new_client();
await client.connect(); await client.connect();
console.log("BEFG");
let res; let res;
if (typeof idOrName !== 'number') { if (typeof idOrName !== 'number') {
res = await client.query("SELECT * FROM membres WHERE nom_membre=$1;", [`${idOrName}`]); res = await client.query("SELECT * FROM membres WHERE nom_membre=$1;", [`${idOrName}`]);
} else { } else {
res = await client.query("SELECT * FROM membres WHERE id_membre=$1;", [idOrName]); res = await client.query("SELECT * FROM membres WHERE id_membre=$1;", [idOrName]);
} }
console.log("AFTG");
if (res.rows.length === 0) { if (res.rows.length === 0) {
await client.end(); await client.end();
return eitherRight<Member, string>("Does not exist."); return eitherRight<Member, string>("Does not exist.");
@ -28,42 +26,42 @@ async function getMember(idOrName: number | string): Promise<Either<Member, stri
return eitherLeft<Member, string>(member); return eitherLeft<Member, string>(member);
} }
async function createMember(name: string, passwd: string): Promise<Either<Member, string>> { const createMember = async (name: string, passwd: string): Promise<Either<Member, string>> => {
const gettingMember = await getMember(name); const gettingMember = await getMember(name);
if (!gettingMember.hasRight) { if (!gettingMember.hasRight) {
return eitherRight("Already in database."); return eitherRight<Member, string>("Already in database.");
} }
const client = new_client(); const client = new_client();
await client.connect(); await client.connect();
const res = await client.query("INSERT INTO membres (nom_membre, mdp_membre) VALUES ($1, $2) RETURNING *;", [`${name}`, `${passwd}`]); const res = await client.query("INSERT INTO membres (nom_membre, mdp_membre) VALUES ($1, $2) RETURNING *;", [`${name}`, `${passwd}`]);
if (res.rows.length === 0) { if (res.rows.length === 0) {
await client.end(); await client.end();
return eitherRight("Something went wrong"); return eitherRight<Member, string>("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 }; 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(); await client.end();
return eitherLeft(member); return eitherLeft<Member, string>(member);
} }
function userAdapter(member: Member): User { function userAdapter(member: Member): User {
return { id_member: member.id_member, name: member.name }; return { id_member: member.id_member, name: member.name };
} }
const register = (req: Request, res: Response) => { const register = (req: Request, res: Response) => {
if (!req || !req.body || !req.body.name || !req.body.password) { if (!req || !req.body || !req.body.name || !req.body.password) {
console.log(req.body); res.status(400).send();
res.send(req.body);
return; return;
} }
const name: string = req.body.name; const name: string = req.body.name;
bcrypt.genSalt(10, (err, salt) => { bcrypt.genSalt(10, (err, salt) => {
if (err) { if (err) {
res.status(500); res.status(500).send();
return; return;
} }
bcrypt.hash(req.body.password, salt, async (err, hash) => { bcrypt.hash(req.body.password, salt, async (err, hash) => {
if (err) { if (err) {
res.status(500); res.status(500).send();
return; return;
} }
@ -74,6 +72,30 @@ const register = (req: Request, res: Response) => {
res.send(userAdapter(member.left)); 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<Member, string> = 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 };

View File

@ -1,8 +1,9 @@
import express from 'express'; import express from 'express';
import { register } from '../controllers/members.controller'; import { register, login } from '../controllers/auth.controller';
const router = express.Router(); const router = express.Router();
router.post('/register', register); router.post('/register', register);
router.post('/login', login);
export default router; export default router;

View File

@ -1,5 +1,5 @@
import express from 'express'; import express from 'express';
import membersRoute from './members.route' import authRoute from './auth.route'
import db from '../db'; import db from '../db';
const routes = express.Router(); const routes = express.Router();
@ -14,6 +14,6 @@ routes.get("/message", async (_req, res) => {
res.render('index.ejs', { message }); res.render('index.ejs', { message });
}); });
routes.use("/members", membersRoute); routes.use("/auth", authRoute);
export default routes; export default routes;