From 8f53dd3be7e9af3e8a637b7671ab31474e76ddd5 Mon Sep 17 00:00:00 2001 From: vincentastolfi Date: Wed, 12 Jun 2024 16:57:10 +0200 Subject: [PATCH] :sparkles: Connection and cookies utilisation (workoing pretty well) --- index.js | 45 +++++++++++- package-lock.json | 126 +++++++++++++++++++++++++++++++++ package.json | 2 + public/pages/gameView.html | 3 + public/scripts/gamePageInfo.js | 21 ++++++ 5 files changed, 194 insertions(+), 3 deletions(-) create mode 100644 public/scripts/gamePageInfo.js diff --git a/index.js b/index.js index cf6efe8..9dfcdf6 100644 --- a/index.js +++ b/index.js @@ -4,22 +4,32 @@ const http = require("http").Server(app); const io = require("socket.io")(http); const port = 8080; const db = require("./database.js") - +const jwt = require('jsonwebtoken'); +const cookieParser = require('cookie-parser'); const bodyParser = require("body-parser"); const path = require("path"); const { Room } = require('./businesses/Room.js'); +const { Player } = require(`${__dirname}/businesses/Player.js`); app.use(express.static("public")) -app.use(express.json()); +app.use(bodyParser.json()); +app.use(bodyParser.urlencoded({ extended: true })); +app.use(cookieParser()); -const { Player } = require(`${__dirname}/businesses/Player.js`); +const secretKey = process.env.COOKIE_SECRET_KEY; app.get('/', (req, res) => { res.sendFile(path.join(__dirname, '/public/pages/connectionView.html')) }) app.get('/game', (req, res) => { + const token = req.cookies.authToken; + + if (!token) { + return res.status(401).send('Access denied. No token provided.'); + } + res.sendFile(path.join(__dirname, '/public/pages/gameView.html')) }) @@ -37,10 +47,39 @@ app.post('/register', (req, res) => { return res.status(500).send('Internal server error.'); } + const token = jwt.sign({ pseudo }, secretKey, { expiresIn: '1h' }); + res.cookie('authToken', token, { httpOnly: true, secure: false }); + res.status(201).send({message: 'User registered successfully.', redirectUrl: '/game' }); }) }); +app.get('/user-info', (req, res) => { + const token = req.cookies.authToken; + + if (!token) { + return res.status(401).send('Access denied. No token provided.'); + } + + try { + const decoded = jwt.verify(token, secretKey); + const query = 'SELECT pseudo FROM users WHERE pseudo = ?'; + db.query(query, [decoded.pseudo], (err, results) => { + console.log(results) + if (err) { + console.error('Error retrieving user info from the database:', err); + return res.status(500).send('Internal server error.'); + } + if (results.length === 0) { + return res.status(404).send('User not found.'); + } + res.json(results[0]); + }); + } catch (ex) { + res.status(400).send('Invalid token.'); + } +}); + let rooms = []; let players = []; diff --git a/package-lock.json b/package-lock.json index 1847c6b..b2079c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,9 @@ "license": "ISC", "dependencies": { "body-parser": "^1.20.2", + "cookie-parser": "^1.4.6", "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", "mysql": "^2.18.1", "socket.io": "^4.7.5", "uuid": "^9.0.1" @@ -98,6 +100,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "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==" + }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -151,6 +158,26 @@ "node": ">= 0.6" } }, + "node_modules/cookie-parser": { + "version": "1.4.6", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.6.tgz", + "integrity": "sha512-z3IzaNjdwUC2olLIB5/ITd0/setiaFMLYiZJle7xg5Fe9KWAceil7xszYfHHBtDFYLSgJduS2Ty0P1uJdPDJeA==", + "dependencies": { + "cookie": "0.4.1", + "cookie-signature": "1.0.6" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/cookie-parser/node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -214,6 +241,14 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "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==", + "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", @@ -515,6 +550,86 @@ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, + "node_modules/jsonwebtoken": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", + "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", + "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==" + }, + "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==", + "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==", + "dependencies": { + "jwa": "^1.4.1", + "safe-buffer": "^5.0.1" + } + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "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==" + }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==" + }, "node_modules/media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", @@ -734,6 +849,17 @@ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", diff --git a/package.json b/package.json index 1911f4d..77fc228 100644 --- a/package.json +++ b/package.json @@ -11,7 +11,9 @@ "license": "ISC", "dependencies": { "body-parser": "^1.20.2", + "cookie-parser": "^1.4.6", "express": "^4.19.2", + "jsonwebtoken": "^9.0.2", "mysql": "^2.18.1", "socket.io": "^4.7.5", "uuid": "^9.0.1" diff --git a/public/pages/gameView.html b/public/pages/gameView.html index 5e2ee2a..4b5243f 100644 --- a/public/pages/gameView.html +++ b/public/pages/gameView.html @@ -54,6 +54,8 @@ Rotate +

+

You have to play

Hit !

WIN !

@@ -61,5 +63,6 @@ + diff --git a/public/scripts/gamePageInfo.js b/public/scripts/gamePageInfo.js new file mode 100644 index 0000000..65544b8 --- /dev/null +++ b/public/scripts/gamePageInfo.js @@ -0,0 +1,21 @@ +document.addEventListener('DOMContentLoaded', async () => { + const playerInfoDiv = document.getElementById('playerInfo'); + + try { + const response = await fetch('/user-info', { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + }, + }); + + if (response.ok) { + const userInfo = await response.json(); + playerInfoDiv.textContent = `Logged in as: ${userInfo.pseudo}`; + } else { + playerInfoDiv.textContent = 'Error: Could not retrieve user information.'; + } + } catch (error) { + playerInfoDiv.textContent = `Error: ${error.message}`; + } +}); \ No newline at end of file