feat: add JWT

This commit is contained in:
Alessandre Laguierce 2024-10-26 16:36:24 +02:00
parent 68773db8d6
commit 945109a6f0
4 changed files with 28 additions and 11 deletions

View File

@ -2,7 +2,8 @@
# .env.production for production # .env.production for production
NODE_PORT=3000 NODE_PORT=3000
NODE_ENV=dev NODE_ENV=dev
NODE_JWT_ISSUER="free-briques"
NODE_JWT_SECRET="ec2fbbfed81a2fef0115ed3de701071db6a6234550624f604f14ddf422bb9761"
# those values must be the same as in ../docker-compose.dev.yml # those values must be the same as in ../docker-compose.dev.yml
DB_HOST=localhost DB_HOST=localhost
DB_NAME=briques_db DB_NAME=briques_db

View File

@ -1,5 +1,7 @@
NODE_PORT=3000 NODE_PORT=3000
NODE_ENV=production NODE_ENV=production
NODE_JWT_ISSUER="free-briques"
NODE_JWT_SECRET="ec2fbbfed81a2fef0115ed3de701071db6a6234550624f604f14ddf422bb9761"
DB_HOST=briques_postgres DB_HOST=briques_postgres
DB_NAME=briques_db DB_NAME=briques_db
DB_USER=briques_llm DB_USER=briques_llm

View File

@ -1,9 +1,9 @@
import { createSecretKey } from 'crypto'; import { createSecretKey } from 'crypto';
const JWT_ISSUER = process.env.NODE_JWT_ISSUER as string; const JWT_ISSUER = (process.env.NODE_JWT_ISSUER ?? 'free-briques') as string;
const JWT_AUDIENCE = '*'; const JWT_AUDIENCE = '*';
const JWT_SECRET = process.env.NODE_JWT_SECRET as string; const JWT_SECRET = (process.env.NODE_JWT_SECRET) as string;
const JWT_EXPIRATION = '1 week'; const JWT_EXPIRATION = '1 week';
const JWT_SECRET_KEY = createSecretKey(JWT_SECRET as string, 'utf-8'); const JWT_SECRET_KEY = createSecretKey(JWT_SECRET as string, 'utf-8');
export {JWT_ISSUER, JWT_AUDIENCE, JWT_SECRET, JWT_EXPIRATION, JWT_SECRET_KEY }; export { JWT_ISSUER, JWT_AUDIENCE, JWT_SECRET, JWT_EXPIRATION, JWT_SECRET_KEY };

View File

@ -1,5 +1,7 @@
import { Request, Response, Router } from 'express'; import { Request, Response, Router } from 'express';
import bcrypt from 'bcrypt'; import bcrypt from 'bcrypt';
import { SignJWT } from 'jose';
import { JWT_ISSUER, JWT_AUDIENCE, JWT_SECRET, JWT_EXPIRATION, JWT_SECRET_KEY } from '../config/auth.config';
import { Member, User } from '../types/member'; import { Member, User } from '../types/member';
import { new_client } from '../db/db_client'; import { new_client } from '../db/db_client';
import { Either, eitherLeft, eitherRight } from '../utils/utils'; import { Either, eitherLeft, eitherRight } from '../utils/utils';
@ -47,7 +49,6 @@ 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) {
res.status(400).send(); res.status(400).send();
@ -66,10 +67,17 @@ const register = (req: Request, res: Response) => {
} }
const member: Either<Member, string> = await createMember(name, hash); const member: Either<Member, string> = await createMember(name, hash);
if (member.hasRight) if (member.hasRight) {
res.send(member.right); res.status(401).send(member.right);
else return;
res.send(userAdapter(member.left)); }
const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: userAdapter(member.left), token: token});
}); });
}); });
}; };
@ -85,7 +93,7 @@ const login = async (req: Request, res: Response) => {
res.send(member.right).send(); res.send(member.right).send();
return; return;
} }
bcrypt.compare(req.body.password, member.left.password, (err, r) => { bcrypt.compare(req.body.password, member.left.password, async (err, r) => {
if (err) { if (err) {
res.status(500).send(); res.status(500).send();
return; return;
@ -94,7 +102,13 @@ const login = async (req: Request, res: Response) => {
res.status(401).send(); res.status(401).send();
return; return;
} }
res.status(200).send(); const token = await new SignJWT({ name })
.setProtectedHeader({ alg: 'HS256' })
.setAudience(JWT_AUDIENCE)
.setIssuer(JWT_ISSUER)
.setExpirationTime(JWT_EXPIRATION)
.sign(JWT_SECRET_KEY);
res.status(200).send({ member: userAdapter(member.left), token: token});
}); });
}; };