Create new user
This commit is contained in:
parent
8ca22f35af
commit
febdc7b5c1
5 changed files with 170 additions and 64 deletions
37
server/Auth.js
Normal file
37
server/Auth.js
Normal file
|
|
@ -0,0 +1,37 @@
|
||||||
|
import { randomBytes } from 'crypto'
|
||||||
|
import jwt from 'jsonwebtoken'
|
||||||
|
import db from './Database.js'
|
||||||
|
|
||||||
|
export default {
|
||||||
|
async createAccount(name) {
|
||||||
|
console.log("Creating user");
|
||||||
|
if (db.userExists(name)) {
|
||||||
|
console.log("User exists");
|
||||||
|
return {
|
||||||
|
error: "The name alredy occupied"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const pass = randomBytes(16).toString('hex')
|
||||||
|
const token = jwt.sign({
|
||||||
|
name: name,
|
||||||
|
record: 0,
|
||||||
|
rank: 0
|
||||||
|
}, process.env.secret)
|
||||||
|
|
||||||
|
await db.addUser({
|
||||||
|
name,
|
||||||
|
pass,
|
||||||
|
record: 0,
|
||||||
|
rank: 0,
|
||||||
|
})
|
||||||
|
|
||||||
|
return {
|
||||||
|
name,
|
||||||
|
pass,
|
||||||
|
record: 0,
|
||||||
|
rank: 0,
|
||||||
|
token
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
33
server/Database.js
Normal file
33
server/Database.js
Normal file
|
|
@ -0,0 +1,33 @@
|
||||||
|
import { join, dirname } from 'path'
|
||||||
|
import { Low, JSONFile } from 'lowdb'
|
||||||
|
import { fileURLToPath } from 'url'
|
||||||
|
|
||||||
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||||
|
|
||||||
|
class Database {
|
||||||
|
constructor() {
|
||||||
|
const file = join(__dirname, 'storage', 'db.json')
|
||||||
|
const adapter = new JSONFile(file)
|
||||||
|
this.db = new Low(adapter)
|
||||||
|
}
|
||||||
|
|
||||||
|
async read() {
|
||||||
|
await this.db.read();
|
||||||
|
this.db.data = this.db.data || {
|
||||||
|
users: [],
|
||||||
|
records: []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
userExists(name) {
|
||||||
|
return this.db.data.users.find(user => user.name == name) !== undefined
|
||||||
|
}
|
||||||
|
|
||||||
|
async addUser(user) {
|
||||||
|
this.db.data.users.push(user)
|
||||||
|
await this.db.write()
|
||||||
|
return user
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default new Database
|
||||||
92
server/package-lock.json
generated
92
server/package-lock.json
generated
|
|
@ -15,7 +15,8 @@
|
||||||
"@babel/preset-env": "^7.15.6",
|
"@babel/preset-env": "^7.15.6",
|
||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"express-jwt": "^6.1.0"
|
"jsonwebtoken": "^8.5.1",
|
||||||
|
"lowdb": "^3.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^2.0.13"
|
"nodemon": "^2.0.13"
|
||||||
|
|
@ -1766,11 +1767,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||||
},
|
},
|
||||||
"node_modules/async": {
|
|
||||||
"version": "1.5.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
|
||||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
|
||||||
},
|
|
||||||
"node_modules/babel-plugin-dynamic-import-node": {
|
"node_modules/babel-plugin-dynamic-import-node": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
|
||||||
|
|
@ -2521,25 +2517,6 @@
|
||||||
"node": ">= 0.10.0"
|
"node": ">= 0.10.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/express-jwt": {
|
|
||||||
"version": "6.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-6.1.0.tgz",
|
|
||||||
"integrity": "sha512-mmSR52Ps1FMeGwchroHzEJONWhsobd5KHVVKBffYiUEpZh9iK9wI9ZWkmzY5ROwWQtJLNGHV/VUMLh2M208s4Q==",
|
|
||||||
"dependencies": {
|
|
||||||
"async": "^1.5.0",
|
|
||||||
"express-unless": "^1.0.0",
|
|
||||||
"jsonwebtoken": "^8.1.0",
|
|
||||||
"lodash.set": "^4.0.0"
|
|
||||||
},
|
|
||||||
"engines": {
|
|
||||||
"node": ">= 8.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"node_modules/express-unless": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/express-unless/-/express-unless-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-zXSSClWBPfcSYjg0hcQNompkFN/MxQQ53eyrzm9BYgik2ut2I7PxAf2foVqBRMYCwWaZx/aWodi+uk76npdSAw=="
|
|
||||||
},
|
|
||||||
"node_modules/express/node_modules/debug": {
|
"node_modules/express/node_modules/debug": {
|
||||||
"version": "2.6.9",
|
"version": "2.6.9",
|
||||||
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
"resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
|
||||||
|
|
@ -3424,10 +3401,19 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||||
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||||
},
|
},
|
||||||
"node_modules/lodash.set": {
|
"node_modules/lowdb": {
|
||||||
"version": "4.3.2",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/lowdb/-/lowdb-3.0.0.tgz",
|
||||||
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
"integrity": "sha512-9KZRulmIcU8fZuWiaM0d5e2/nPnrFyXkeXVpqT+MJS+vgbgOf1EbtvgQmba8HwUFgDl1oeZR6XqEJnkJmQdKmg==",
|
||||||
|
"dependencies": {
|
||||||
|
"steno": "^2.1.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": "^12.20.0 || ^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/typicode"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"node_modules/lowercase-keys": {
|
"node_modules/lowercase-keys": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
|
|
@ -4266,6 +4252,17 @@
|
||||||
"node": ">= 0.6"
|
"node": ">= 0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/steno": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/steno/-/steno-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-mauOsiaqTNGFkWqIfwcm3y/fq+qKKaIWf1vf3ocOuTdco9XoHCO2AGF1gFYXuZFSWuP38Q8LBHBGJv2KnJSXyA==",
|
||||||
|
"engines": {
|
||||||
|
"node": "^14.13.1 || >=16.0.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://github.com/sponsors/typicode"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/string-width": {
|
"node_modules/string-width": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||||
|
|
@ -5853,11 +5850,6 @@
|
||||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||||
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
"integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
|
||||||
},
|
},
|
||||||
"async": {
|
|
||||||
"version": "1.5.2",
|
|
||||||
"resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
|
|
||||||
"integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo="
|
|
||||||
},
|
|
||||||
"babel-plugin-dynamic-import-node": {
|
"babel-plugin-dynamic-import-node": {
|
||||||
"version": "2.3.3",
|
"version": "2.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
|
||||||
|
|
@ -6458,22 +6450,6 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"express-jwt": {
|
|
||||||
"version": "6.1.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/express-jwt/-/express-jwt-6.1.0.tgz",
|
|
||||||
"integrity": "sha512-mmSR52Ps1FMeGwchroHzEJONWhsobd5KHVVKBffYiUEpZh9iK9wI9ZWkmzY5ROwWQtJLNGHV/VUMLh2M208s4Q==",
|
|
||||||
"requires": {
|
|
||||||
"async": "^1.5.0",
|
|
||||||
"express-unless": "^1.0.0",
|
|
||||||
"jsonwebtoken": "^8.1.0",
|
|
||||||
"lodash.set": "^4.0.0"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"express-unless": {
|
|
||||||
"version": "1.0.0",
|
|
||||||
"resolved": "https://registry.npmjs.org/express-unless/-/express-unless-1.0.0.tgz",
|
|
||||||
"integrity": "sha512-zXSSClWBPfcSYjg0hcQNompkFN/MxQQ53eyrzm9BYgik2ut2I7PxAf2foVqBRMYCwWaZx/aWodi+uk76npdSAw=="
|
|
||||||
},
|
|
||||||
"fill-range": {
|
"fill-range": {
|
||||||
"version": "7.0.1",
|
"version": "7.0.1",
|
||||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||||
|
|
@ -7110,10 +7086,13 @@
|
||||||
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
|
||||||
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
"integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w="
|
||||||
},
|
},
|
||||||
"lodash.set": {
|
"lowdb": {
|
||||||
"version": "4.3.2",
|
"version": "3.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/lowdb/-/lowdb-3.0.0.tgz",
|
||||||
"integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM="
|
"integrity": "sha512-9KZRulmIcU8fZuWiaM0d5e2/nPnrFyXkeXVpqT+MJS+vgbgOf1EbtvgQmba8HwUFgDl1oeZR6XqEJnkJmQdKmg==",
|
||||||
|
"requires": {
|
||||||
|
"steno": "^2.1.0"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
"lowercase-keys": {
|
"lowercase-keys": {
|
||||||
"version": "1.0.1",
|
"version": "1.0.1",
|
||||||
|
|
@ -7753,6 +7732,11 @@
|
||||||
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
|
||||||
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
"integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow="
|
||||||
},
|
},
|
||||||
|
"steno": {
|
||||||
|
"version": "2.1.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/steno/-/steno-2.1.0.tgz",
|
||||||
|
"integrity": "sha512-mauOsiaqTNGFkWqIfwcm3y/fq+qKKaIWf1vf3ocOuTdco9XoHCO2AGF1gFYXuZFSWuP38Q8LBHBGJv2KnJSXyA=="
|
||||||
|
},
|
||||||
"string-width": {
|
"string-width": {
|
||||||
"version": "4.2.3",
|
"version": "4.2.3",
|
||||||
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
"resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
|
||||||
|
|
|
||||||
|
|
@ -4,19 +4,21 @@
|
||||||
"description": "",
|
"description": "",
|
||||||
"main": "index.js",
|
"main": "index.js",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "nodemon --exec babel-node server.js"
|
"start": "nodemon --ignore ./storage/ --exec babel-node server.js"
|
||||||
},
|
},
|
||||||
|
"type": "module",
|
||||||
"keywords": [],
|
"keywords": [],
|
||||||
"author": "Grzegorz Kupczyk",
|
"author": "Grzegorz Kupczyk",
|
||||||
"license": "ISC",
|
"license": "ISC",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"dotenv": "^10.0.0",
|
|
||||||
"express": "^4.17.1",
|
|
||||||
"express-jwt": "^6.1.0",
|
|
||||||
"@babel/cli": "^7.15.7",
|
"@babel/cli": "^7.15.7",
|
||||||
"@babel/core": "^7.15.5",
|
"@babel/core": "^7.15.5",
|
||||||
"@babel/node": "^7.15.4",
|
"@babel/node": "^7.15.4",
|
||||||
"@babel/preset-env": "^7.15.6"
|
"@babel/preset-env": "^7.15.6",
|
||||||
|
"dotenv": "^10.0.0",
|
||||||
|
"express": "^4.17.1",
|
||||||
|
"jsonwebtoken": "^8.5.1",
|
||||||
|
"lowdb": "^3.0.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^2.0.13"
|
"nodemon": "^2.0.13"
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,61 @@
|
||||||
import express from 'express'
|
|
||||||
import 'dotenv/config'
|
import 'dotenv/config'
|
||||||
|
|
||||||
const app = express()
|
import express from 'express'
|
||||||
|
import jwt from 'jsonwebtoken'
|
||||||
|
import auth from './Auth.js'
|
||||||
|
import db from './Database.js'
|
||||||
|
|
||||||
|
const protect = (req, res, next) => {
|
||||||
|
const authHeader = req.headers.authorization;
|
||||||
|
|
||||||
|
if (!authHeader) {
|
||||||
|
res.sendStatus(401)
|
||||||
|
}
|
||||||
|
|
||||||
|
const token = authHeader.split(' ')[1];
|
||||||
|
|
||||||
|
jwt.verify(token, process.env.secret, (err, user) => {
|
||||||
|
if (err)
|
||||||
|
return res.sendStatus(403)
|
||||||
|
|
||||||
|
req.user = user
|
||||||
|
next()
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const app = express()
|
||||||
|
app.use(express.json())
|
||||||
|
|
||||||
|
app.get("/", (_, res) => {
|
||||||
|
res.json({ message: "Hello! API here" })
|
||||||
|
|
||||||
app.get("/", (req, res) => {
|
|
||||||
res.send("hello")
|
|
||||||
console.log(process.env.secret);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
app.get("/secured", protect, (req, res) => {
|
||||||
|
res.json({ message: "You can see it!", payload: req.user })
|
||||||
|
})
|
||||||
|
|
||||||
|
app.post("/signup", async (req, res) => {
|
||||||
|
if (!req.body.name)
|
||||||
|
return res.status(400).json({
|
||||||
|
error: "missing argument name"
|
||||||
|
})
|
||||||
|
|
||||||
|
const info = await auth.createAccount(req.body.name)
|
||||||
|
|
||||||
|
if (info.error)
|
||||||
|
return res.status(400).json({
|
||||||
|
error: info.error
|
||||||
|
})
|
||||||
|
|
||||||
|
res.json(info)
|
||||||
|
})
|
||||||
|
|
||||||
|
app.use(function (err, req, res, next) {
|
||||||
|
if (err.name === 'UnauthorizedError') {
|
||||||
|
res.status(401).send('invalid token...');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
await db.read()
|
||||||
app.listen(3000)
|
app.listen(3000)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue