From 86acedc8aae352180dab0c89d5473eab6afc3f58 Mon Sep 17 00:00:00 2001 From: Tobias Zoghaib Date: Thu, 14 Nov 2024 15:32:28 +0100 Subject: [PATCH] Authentification Token --- .../backend/middlewares/auth.middleware.ts | 22 ++++ software/backend/routes/account.routes.ts | 78 ++++++++---- software/package-lock.json | 116 +++++++++++++++++- software/package.json | 2 + .../navigation/navigationAppendItems.vue | 10 +- software/src/data/api/accountApi.ts | 21 +++- .../src/pages/account/loginPage/loginForm.vue | 4 +- .../pages/account/loginPage/registerForm.vue | 6 + software/src/scripts/pdfScripts.ts | 37 +++--- software/src/stores/account.store.ts | 45 +++++-- 10 files changed, 283 insertions(+), 58 deletions(-) create mode 100644 software/backend/middlewares/auth.middleware.ts diff --git a/software/backend/middlewares/auth.middleware.ts b/software/backend/middlewares/auth.middleware.ts new file mode 100644 index 0000000..e0ef8a7 --- /dev/null +++ b/software/backend/middlewares/auth.middleware.ts @@ -0,0 +1,22 @@ +import { NextFunction, Request, Response } from "express"; +import jwt from "jsonwebtoken" + +export function verifyToken(req: Request, res: Response, next: NextFunction) { + const token = req.header("Authorization") + + if(!token) { + return res.status(401).json({ + error: "Access denied" + }) + } + + try { + const decoded = jwt.verify(token, 'sjcucjdkdf') + req["id"] = decoded["userId"] + next() + } catch(error) { + res.status(401).json({ + error: "Invalid token" + }) + } +} \ No newline at end of file diff --git a/software/backend/routes/account.routes.ts b/software/backend/routes/account.routes.ts index b7d2d14..2c8f33e 100644 --- a/software/backend/routes/account.routes.ts +++ b/software/backend/routes/account.routes.ts @@ -6,6 +6,8 @@ import { Payment } from "../models/user/payment.model"; import { AccountRole } from "../models/user/accountRole.model"; import { Exercise } from "../models/exercises/exercise.model"; import { sequelize } from "../database"; +import jwt from "jsonwebtoken" +import { verifyToken } from "../middlewares/auth.middleware"; export const account = Router() @@ -19,30 +21,36 @@ account.get("/", (req: Request, res: Response) => { }) // Login user -account.post("/login", async (req: Request, res: Response) => { +account.get("/login", async (req: Request, res: Response) => { // Using raw SQL code for SQL injections! const [results, metadata] = await sequelize.query( "SELECT * FROM Accounts " + - "WHERE (username='" + req.body.username + - "' AND password='" + req.body.password + "')") + "WHERE (username='" + req.query.username + + "' AND password='" + req.query.password + "')" + ) // Mechanism to check exercise solved if (results.length > 1) { Exercise.update( - { solved: true }, - { - where: { - nameEn: "Register" - } + { solved: true }, + { + where: { + nameEn: "Register" } - ) + } + ) } if (results.length != 0) { - + // Creating session token + const token = jwt.sign({ userId: results[0]["id"] }, 'sjcucjdkdf') + // Status: 200 OK - res.status(200).json(results[0]) + res.status(200).json({ + "success": true, + "token": token + }) } else { // Status: 401 Unauthorized res.status(401).json({ @@ -52,6 +60,20 @@ account.post("/login", async (req: Request, res: Response) => { } }) + +account.get("/account", verifyToken, async(req: Request, res: Response) => { + Account.findOne({ + where: { + id: req["id"] + }, + include: [ Address, AccountRole, Payment ] + }) + .then(account => { + res.status(200).json(account) + }) +}) + + // Creating a new user account.post("/", async (req: Request, res: Response) => { // Check if username is valid @@ -97,26 +119,38 @@ account.post("/", async (req: Request, res: Response) => { }) }) -account.patch("/", (req: Request, res: Response) => { +account.patch("/", verifyToken, (req: Request, res: Response) => { Account.update(req.body, { where: { id: req.body.id } }) .then(async account => { for (let payment of req.body.payments) { - await Payment.update(payment, - { - where: { id: payment.id } - } - ) + if (payment.id == undefined) { + payment["accountId"] = req.body.id + + await Payment.create(payment) + } else { + await Payment.update(payment, + { + where: { id: payment.id } + } + ) + } } for (let address of req.body.addresses) { - await Address.update(address, - { - where: { id: address.id } - } - ) + if (address.id == undefined) { + address["accountId"] = req.body.id + + await Address.create(address) + } else { + await Address.update(address, + { + where: { id: address.id } + } + ) + } } // Status: 200 OK diff --git a/software/package-lock.json b/software/package-lock.json index a4fcc52..6daf77c 100644 --- a/software/package-lock.json +++ b/software/package-lock.json @@ -17,6 +17,7 @@ "cors": "^2.8.5", "electron-squirrel-startup": "^1.0.1", "express": "^4.21.1", + "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", "multer": "^1.4.5-lts.1", "pinia": "^2.2.4", @@ -36,6 +37,7 @@ "@electron/fuses": "^1.8.0", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.7", "@types/node": "^22.7.6", "@vitejs/plugin-vue": "^5.1.4", "concurrently": "^9.0.1", @@ -2096,6 +2098,16 @@ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", "license": "MIT" }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.7.tgz", + "integrity": "sha512-ugo316mmTYBl2g81zDFnZ7cfxlut3o+/EQdaP7J8QN2kY6lJ22hmQYCK5EHcJHbrW+dkCGSCPgbG8JtYj6qSrg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/keyv": { "version": "3.1.4", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz", @@ -3223,6 +3235,12 @@ "node": "*" } }, + "node_modules/buffer-equal-constant-time": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", + "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", + "license": "BSD-3-Clause" + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", @@ -4424,6 +4442,15 @@ "dev": true, "license": "MIT" }, + "node_modules/ecdsa-sig-formatter": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", + "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", + "license": "Apache-2.0", + "dependencies": { + "safe-buffer": "^5.0.1" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -5987,6 +6014,55 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "license": "MIT", + "dependencies": { + "jws": "^3.2.2", + "lodash.includes": "^4.3.0", + "lodash.isboolean": "^3.0.3", + "lodash.isinteger": "^4.0.4", + "lodash.isnumber": "^3.0.3", + "lodash.isplainobject": "^4.0.6", + "lodash.isstring": "^4.0.1", + "lodash.once": "^4.0.0", + "ms": "^2.1.1", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + } + }, + "node_modules/jsonwebtoken/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" + }, + "node_modules/jwa": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz", + "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==", + "license": "MIT", + "dependencies": { + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/jws": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", + "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", + "license": "MIT", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", @@ -6084,13 +6160,47 @@ "license": "MIT", "peer": true }, + "node_modules/lodash.includes": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", + "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", + "license": "MIT" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", + "license": "MIT" + }, + "node_modules/lodash.isinteger": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", + "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", + "license": "MIT" + }, + "node_modules/lodash.isnumber": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", + "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", + "license": "MIT" + }, "node_modules/lodash.isplainobject": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" + }, + "node_modules/lodash.isstring": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", + "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", + "license": "MIT" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "license": "MIT" }, "node_modules/lodash.union": { "version": "4.6.0", diff --git a/software/package.json b/software/package.json index a01e6da..2c869de 100644 --- a/software/package.json +++ b/software/package.json @@ -41,6 +41,7 @@ "cors": "^2.8.5", "electron-squirrel-startup": "^1.0.1", "express": "^4.21.1", + "jsonwebtoken": "^9.0.2", "moment": "^2.30.1", "multer": "^1.4.5-lts.1", "pinia": "^2.2.4", @@ -60,6 +61,7 @@ "@electron/fuses": "^1.8.0", "@types/cors": "^2.8.17", "@types/express": "^4.17.21", + "@types/jsonwebtoken": "^9.0.7", "@types/node": "^22.7.6", "@vitejs/plugin-vue": "^5.1.4", "concurrently": "^9.0.1", diff --git a/software/src/components/navigation/navigationAppendItems.vue b/software/src/components/navigation/navigationAppendItems.vue index ab9fb51..06c458d 100644 --- a/software/src/components/navigation/navigationAppendItems.vue +++ b/software/src/components/navigation/navigationAppendItems.vue @@ -13,7 +13,13 @@ exerciseStore.getAllExercises()