From c5819a4f74f644eccec9791f170fcd66251327ac Mon Sep 17 00:00:00 2001 From: Anatoly Kopyl Date: Tue, 23 Mar 2021 03:02:00 +0300 Subject: [PATCH] Moved public files to separate folder and added .env --- package-lock.json | 131 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 5 +- public/index.html | 25 +++++++++ public/index.js | 0 public/style.css | 14 +++++ server.js | 58 +++++++++++++++----- 6 files changed, 218 insertions(+), 15 deletions(-) create mode 100644 public/index.html create mode 100644 public/index.js create mode 100644 public/style.css diff --git a/package-lock.json b/package-lock.json index 2295530..f2f434b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,8 +9,11 @@ "license": "ISC", "dependencies": { "bcrypt": "^5.0.1", + "dotenv": "^8.2.0", "express": "^4.17.1", - "mongodb": "^3.6.5" + "express-session": "^1.17.1", + "mongodb": "^3.6.5", + "uuid4": "^2.0.2" }, "devDependencies": { "nodemon": "^2.0.7" @@ -710,6 +713,14 @@ "node": ">=8" } }, + "node_modules/dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", + "engines": { + "node": ">=8" + } + }, "node_modules/duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -806,6 +817,37 @@ "node": ">= 0.10.0" } }, + "node_modules/express-session": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", + "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", + "dependencies": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/express-session/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express-session/node_modules/safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1621,6 +1663,14 @@ "node": ">= 0.8" } }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -1757,6 +1807,14 @@ "node": ">=0.6" } }, + "node_modules/random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -2190,6 +2248,17 @@ "is-typedarray": "^1.0.0" } }, + "node_modules/uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "dependencies": { + "random-bytes": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -2271,6 +2340,11 @@ "node": ">= 0.4.0" } }, + "node_modules/uuid4": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uuid4/-/uuid4-2.0.2.tgz", + "integrity": "sha512-TzsQS8sN1B2m9WojyNp0X/3JL8J2RScnrAJnooNPL6lq3lA02/XdoWysyUgI6rAif0DzkkWk51N6OggujPy2RA==" + }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2919,6 +2993,11 @@ "is-obj": "^2.0.0" } }, + "dotenv": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", + "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" + }, "duplexer3": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", @@ -3003,6 +3082,33 @@ "vary": "~1.1.2" } }, + "express-session": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.17.1.tgz", + "integrity": "sha512-UbHwgqjxQZJiWRTMyhvWGvjBQduGCSBDhhZXYenziMFjxst5rMV+aJZ6hKPHZnPyHGsrqRICxtX8jtEbm/z36Q==", + "requires": { + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-headers": "~1.0.2", + "parseurl": "~1.3.3", + "safe-buffer": "5.2.0", + "uid-safe": "~2.1.5" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "safe-buffer": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", + "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -3596,6 +3702,11 @@ "ee-first": "1.1.1" } }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -3701,6 +3812,11 @@ "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -4043,6 +4159,14 @@ "is-typedarray": "^1.0.0" } }, + "uid-safe": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.5.tgz", + "integrity": "sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==", + "requires": { + "random-bytes": "~1.0.0" + } + }, "undefsafe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.3.tgz", @@ -4106,6 +4230,11 @@ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, + "uuid4": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/uuid4/-/uuid4-2.0.2.tgz", + "integrity": "sha512-TzsQS8sN1B2m9WojyNp0X/3JL8J2RScnrAJnooNPL6lq3lA02/XdoWysyUgI6rAif0DzkkWk51N6OggujPy2RA==" + }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", diff --git a/package.json b/package.json index cc7657a..0ef14f3 100644 --- a/package.json +++ b/package.json @@ -18,8 +18,11 @@ "homepage": "https://github.com/anatolykopyl/registration#readme", "dependencies": { "bcrypt": "^5.0.1", + "dotenv": "^8.2.0", "express": "^4.17.1", - "mongodb": "^3.6.5" + "express-session": "^1.17.1", + "mongodb": "^3.6.5", + "uuid4": "^2.0.2" }, "devDependencies": { "nodemon": "^2.0.7" diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..4fb253c --- /dev/null +++ b/public/index.html @@ -0,0 +1,25 @@ + + + + + + + + Registration + + +

Register

+
+ Username: + Password: + +
+ +

Login

+
+ Username: + Password: + +
+ + \ No newline at end of file diff --git a/public/index.js b/public/index.js new file mode 100644 index 0000000..e69de29 diff --git a/public/style.css b/public/style.css new file mode 100644 index 0000000..4eea963 --- /dev/null +++ b/public/style.css @@ -0,0 +1,14 @@ +* { + text-align: center; + font-family: 'Courier New', Courier, monospace; +} + +span.input_row { + display: flex; + justify-content: space-between; +} + +form { + width: 30%; + margin: auto; +} \ No newline at end of file diff --git a/server.js b/server.js index df37ce0..b76d8b6 100644 --- a/server.js +++ b/server.js @@ -1,40 +1,72 @@ const express = require('express') +const session = require('express-session') const app = express() const {MongoClient} = require('mongodb') const bcrypt = require('bcrypt') +//const uuid4 = require('uuid4') +require('dotenv').config() +app.use(express.static("public")); app.use(express.json()) -const uri = "mongodb://localhost?retryWrites=true&w=majority" -const client = new MongoClient(uri, { useUnifiedTopology: true }) +app.use(session({ + secret: process.env.SECRET, + resave: false, + saveUninitialized: true, + cookie: { maxAge: 1000 * 60 * 60 * 24 } +})) + +const client = new MongoClient(process.env.URI, { useUnifiedTopology: true }) +client.connect() + +app.get('/', (_, res) => { + res.sendFile('index.html') +}) app.get('/get-users', async (_, res) => { try { - await client.connect() const users = await client.db('reg_example').collection('users').find().toArray() res.send(users) } catch (e) { - console.log("Database error: " + e) - res.status(500) - } finally { - client.close() + console.log("Error: " + e) + res.status(500).send() } }) app.get('/register', async (req, res) => { const hashedPass = await bcrypt.hash(req.query.pass, 10) try { - await client.connect() await client.db('reg_example').collection('users').insertOne({ login: req.query.login, pass: hashedPass }) - res.status(201).send(); + res.status(201).send("Welcome aboard!") } catch (e) { - console.log("Database error: " + e) - res.status(500) - } finally { - client.close() + console.log("Error: " + e) + res.status(500).send() } }) +app.get('/login', async (req, res) => { + try { + const user = await client.db('reg_example').collection('users').findOne({ + login: req.query.login + }) + if (user && bcrypt.compareSync(req.query.pass, user.pass)) { + res.status(200).send("Logged in!") + } else { + res.status(401).send("Invalid login credentials") + } + } catch (e) { + console.log("Error: " + e) + res.status(500).send() + } +}) + +app.get('/logout', (req, res) => { + if (req.session) { + req.session.destroy(function() {}) + } + res.send() +}) + app.listen(3000)