diff --git a/API/.env b/API/.env index 48e75ec750ebe425f9066c5612f6735903cbbe57..c2da4ed548b26cbae7b57bc4f77c5a16b2053dd5 100644 --- a/API/.env +++ b/API/.env @@ -1,3 +1,5 @@ ########################### Server env vars API_PORT=30992 +########################### (openssl rand -hex 32) +SECRET_KEY="d8e730bd53c2cb0b9271bded343dd19ceef04e58e6a10eafe29c8f4a9a99f488" diff --git a/API/src/database/database.sqlite b/API/src/database/database.sqlite index e7da284434d84742aed929297a91ca2b3b886e74..ed7be32ccd95fadcfdba4d8983a6d5731c58f8a2 100644 Binary files a/API/src/database/database.sqlite and b/API/src/database/database.sqlite differ diff --git a/API/src/routes/BaseRoutes.ts b/API/src/routes/BaseRoutes.ts index aeb0f7a3a4842d16970518552adaee4942cb1bb0..7c76bdff2bfabff5048f8fac4bf22c0928209f56 100644 --- a/API/src/routes/BaseRoutes.ts +++ b/API/src/routes/BaseRoutes.ts @@ -4,7 +4,7 @@ import { StatusCodes } from 'http-status-codes'; const router: express.Router = express.Router(); -router.get('/', (req: express.Request, res: express.Response) => res.status(StatusCodes.OK).json({message: "Base route"})); +router.get('/token/login', (req: express.Request, res: express.Response) => res.status(StatusCodes.OK).json({message: "Base route"})); diff --git a/API/src/routes/middleware.ts b/API/src/routes/middleware.ts index 0c49da6e44e4d7e956ef3440463545acc48ba67d..3c3164c36f0467489626ed1b46ebafd347b1f834 100644 --- a/API/src/routes/middleware.ts +++ b/API/src/routes/middleware.ts @@ -1,8 +1,10 @@ -import express from 'express'; -import { StatusCodes } from 'http-status-codes'; +import express from 'express'; +import {StatusCodes} from 'http-status-codes'; import {userType} from '../database/models/User' import {Database} from "../database/Database"; +const jwt = require('jsonwebtoken'); + export function checkUserFields(req: express.Request, res: express.Response, next: express.NextFunction) { if (!req.body.username && !req.body.password && !req.body.accountType) { return res.status(400).json({ error: '"username", "password" and "accountType" required' }); @@ -41,6 +43,31 @@ export async function checkExistingUser(req: express.Request, res: express.Respo } +export interface TokenRequest extends express.Request { + user?: any; +} + +export async function verifyToken(req: TokenRequest, res: express.Response, next: express.NextFunction) { + const authHeader = req.headers['authorization']; + + if (!authHeader) { + return res.status(401).json({message: 'Token not provided', header: req.headers}); + } + const token = authHeader.split(" ")[1]; + + const secretKey = process.env.SECRET_KEY; + + try { + req.user = jwt.verify(token, secretKey); + if(req.user.username !== req.params.admin) + return res.status(403).json({message: 'Invalid token user'}); + //check if admin or user + next(); + } catch (error) { + return res.status(403).json({message: 'Invalid token'}); + } +} + export function checkQuestionFields(req: express.Request, res: express.Response, next: express.NextFunction) { diff --git a/API/src/routes/router-admin.ts b/API/src/routes/router-admin.ts index 3a7672abe342412d1fdcd4f6d81365225779f711..a8a1842e7e883b5e5b8bf9c46db7d437c7ff0d98 100644 --- a/API/src/routes/router-admin.ts +++ b/API/src/routes/router-admin.ts @@ -9,22 +9,18 @@ import { checkQuestionFields, checkUserFields, checkUsernameField, - createAccountCheck + createAccountCheck, verifyToken } from './middleware' import {Database} from "../database/Database"; const router: express.Router = express.Router(); -router.get('/', (req: express.Request, res: express.Response) => { - res.status(StatusCodes.OK).json({ message: 'Admins route' }) -}); -router.get('/:admin', checkExistingUser, (req: express.Request, res: express.Response) => { - res.status(StatusCodes.OK).json({ message: 'Admin id route' }) -}); -router.get('/:admin/list-users', checkExistingUser,async (req: express.Request, res: express.Response) => { + + +router.get('/:admin/list-users', checkExistingUser, verifyToken, async (req: express.Request, res: express.Response) => { try { const users = await Database.getAllUsers(); res.status(StatusCodes.OK).json({users}); @@ -33,7 +29,7 @@ router.get('/:admin/list-users', checkExistingUser,async (req: express.Request, } }); -router.get('/:admin/list-questions', checkExistingUser, async (req: express.Request, res: express.Response) => { +router.get('/:admin/list-questions', checkExistingUser, verifyToken, async (req: express.Request, res: express.Response) => { try { const questions = await Database.getAllQuestions(); questions.forEach(q => { @@ -48,11 +44,11 @@ router.get('/:admin/list-questions', checkExistingUser, async (req: express.Req } }); -router.post('/:admin/create-user-account', checkExistingUser, checkUserFields, (req: express.Request, res: express.Response) => { +router.post('/:admin/create-user-account', checkExistingUser, checkUserFields, verifyToken, (req: express.Request, res: express.Response) => { createAccountCheck(req, res); }); -router.post('/:admin/create-question', checkExistingUser, checkQuestionFields,async (req: express.Request, res: express.Response) => { +router.post('/:admin/create-question', checkExistingUser, checkQuestionFields, verifyToken, async (req: express.Request, res: express.Response) => { const data = req.body; const correctResponse: string = data.possibleResponse[data.correctResponse]; if (correctResponse !== undefined) { @@ -78,7 +74,7 @@ router.post('/:admin/create-question', checkExistingUser, checkQuestionFields,as } }); -router.put('/:admin/update-user-account', checkExistingUser, checkUsernameField, async (req: express.Request, res: express.Response) => { +router.put('/:admin/update-user-account', checkExistingUser, checkUsernameField, verifyToken, async (req: express.Request, res: express.Response) => { const data=req.body; const username = data.username; try{ @@ -109,7 +105,7 @@ router.put('/:admin/update-user-account', checkExistingUser, checkUsernameField, }); -router.put('/:admin/update-question', checkExistingUser,checkIdField,async (req: express.Request, res: express.Response) => { +router.put('/:admin/update-question', checkExistingUser,checkIdField, verifyToken, async (req: express.Request, res: express.Response) => { const data=req.body; const id = data.id; try{ @@ -135,7 +131,7 @@ router.put('/:admin/update-question', checkExistingUser,checkIdField,async (req: -router.delete('/:admin/delete-user-account', checkExistingUser, checkUsernameField, async (req: express.Request, res: express.Response) => { +router.delete('/:admin/delete-user-account', checkExistingUser, checkUsernameField, verifyToken, async (req: express.Request, res: express.Response) => { let data=req.body if(req.params.admin !== data.username) { try{ @@ -157,7 +153,7 @@ router.delete('/:admin/delete-user-account', checkExistingUser, checkUsernameFie }); -router.delete('/:admin/delete-question', checkExistingUser, checkIdField, async (req: express.Request, res: express.Response) => { +router.delete('/:admin/delete-question', checkExistingUser, checkIdField, verifyToken, async (req: express.Request, res: express.Response) => { let data = req.body try { let questionDelete = await Database.deleteQuestion(data.id); @@ -176,7 +172,7 @@ router.delete('/:admin/delete-question', checkExistingUser, checkIdField, async }); -router.post('/:admin/get-user', checkExistingUser, async (req: express.Request, res: express.Response) => { +router.post('/:admin/get-user', checkExistingUser, verifyToken, async (req: express.Request, res: express.Response) => { const data = req.body let user=await Database.infoUser(data.username); user.dataValues.password="CONFIDENTIAL!!!" diff --git a/API/src/routes/router-gamer.ts b/API/src/routes/router-gamer.ts index cf915829b9769fc702354ba63450dd1cfbfbbd6e..415929610f97d2abac8fcc3882222f26600fb99d 100644 --- a/API/src/routes/router-gamer.ts +++ b/API/src/routes/router-gamer.ts @@ -1,6 +1,6 @@ import express from 'express'; import { StatusCodes } from 'http-status-codes'; -import {checkExistingUser} from "./middleware"; +import {checkExistingUser, TokenRequest, verifyToken} from "./middleware"; const router: express.Router = express.Router(); @@ -9,8 +9,8 @@ router.get('/', (req: express.Request, res: express.Response) => { res.status(StatusCodes.OK).json({ message: 'Gamers route' }) }); -router.get('/:username', checkExistingUser, (req: express.Request, res: express.Response) => { - +router.get('/:username', checkExistingUser, verifyToken, (req: TokenRequest, res: express.Response) => { + res.status(StatusCodes.OK).json({access_user: req.user}); }); diff --git a/API/src/routes/router-guest.ts b/API/src/routes/router-guest.ts index 79500bcdd50ece47bfb815a87c4a9967882bf3e7..ad6875e571b780883d9b047a867bb5aeee6a89fb 100644 --- a/API/src/routes/router-guest.ts +++ b/API/src/routes/router-guest.ts @@ -2,6 +2,9 @@ import express from 'express'; import { StatusCodes } from 'http-status-codes'; import {checkExistingUser, checkUserFields, createAccountCheck} from './middleware' import {Database} from "../database/Database"; +import * as process from "process"; +import {userType} from "../database/models/User"; +const jwt = require('jsonwebtoken'); @@ -25,7 +28,11 @@ router.post('/:username', checkExistingUser, async (req: express.Request, res: e if(user){ let usertype=user.dataValues.type === "user"?"USER":"ADMIN" if (user.dataValues.password === data.password) { - res.status(StatusCodes.OK).json({message: usertype+"_ALLOWED"}) + // Génération du token JWT + const userInfo={ type: userType, username: req.params.username, firstname: user.dataValues.firstname, lastname: user.dataValues.lastname } + const secretKey=process.env.SECRET_KEY; + const token = jwt.sign(userInfo, secretKey); + res.status(StatusCodes.OK).json({message: usertype+"_ALLOWED", token: token, firstname: user.dataValues.firstname, lastname: user.dataValues.lastname}); }else{ res.status(StatusCodes.BAD_REQUEST).json({message: "USER_PASSWORD_FALSE"}) } diff --git a/Frontend/quizz-game/src/app/login/session-model.ts b/Frontend/quizz-game/src/app/login/session-model.ts new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391