Přesun autentizace na server

This commit is contained in:
2023-06-28 07:24:26 +02:00
parent 47fbe4173d
commit e81c7d09a3
15 changed files with 297 additions and 134 deletions

View File

@@ -9,6 +9,7 @@ import path from 'path';
import { getMenuSladovnicka, getMenuTechTower, getMenuUMotliku } from "./restaurants";
import { getQr } from "./qr";
import { Restaurants } from "./types";
import { generateToken, getLogin, verify } from "./auth";
const ENVIRONMENT = process.env.NODE_ENV || 'production'
dotenv.config({ path: path.resolve(__dirname, `../.env.${ENVIRONMENT}`) });
@@ -29,6 +30,37 @@ app.use(cors({
origin: '*'
}));
const parseToken = (req: any) => {
if (req?.headers?.authorization) {
return req.headers.authorization.split(' ')[1];
}
}
// ----------- Metody nevyžadující token --------------
app.post("/api/login", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
// TODO zavést podmínky pro délku loginu (min i max)
const token = generateToken(req.body.login);
res.status(200).json(token);
});
// ----------------------------------------------------
/** Middleware ověřující JWT token */
app.use((req, res, next) => {
if (!req.headers.authorization) {
return res.status(401).json({ error: 'Nebyl předán autentizační token' });
}
const token = req.headers.authorization.split(' ')[1];
if (!verify(token)) {
return res.status(403).json({ error: 'Neplatný autentizační token' });
}
next();
});
/** Vrátí data pro aktuální den. */
app.get("/api/data", (req, res) => {
res.status(200).json(getData());
@@ -56,27 +88,21 @@ app.get("/api/pizza", (req, res) => {
/** Založí pizza day pro aktuální den, za předpokladu že dosud neexistuje. */
app.post("/api/createPizzaDay", (req, res) => {
if (!req.body?.creator) {
throw Error("Nebyl předán název zakládajícího");
}
const data = createPizzaDay(req.body.creator);
const login = getLogin(parseToken(req));
const data = createPizzaDay(login);
res.status(200).json(data);
io.emit("message", data);
});
/** Smaže pizza day pro aktuální den, za předpokladu že existuje. */
app.post("/api/deletePizzaDay", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login uživatele");
}
const data = deletePizzaDay(req.body.login);
const login = getLogin(parseToken(req));
const data = deletePizzaDay(login);
io.emit("message", data);
});
app.post("/api/addPizza", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
const login = getLogin(parseToken(req));
if (isNaN(req.body?.pizzaIndex)) {
throw Error("Nebyl předán index pizzy");
}
@@ -92,74 +118,60 @@ app.post("/api/addPizza", (req, res) => {
if (!pizzy[pizzaIndex].sizes[pizzaSizeIndex]) {
throw Error("Neplatný index velikosti pizzy: " + pizzaSizeIndex);
}
const data = addPizzaOrder(req.body.login, pizzy[pizzaIndex], pizzy[pizzaIndex].sizes[pizzaSizeIndex]);
const data = addPizzaOrder(login, pizzy[pizzaIndex], pizzy[pizzaIndex].sizes[pizzaSizeIndex]);
io.emit("message", data);
res.status(200).json({});
})
});
app.post("/api/removePizza", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
const login = getLogin(parseToken(req));
if (!req.body?.pizzaOrder) {
throw Error("Nebyla předána objednávka");
}
const data = removePizzaOrder(req.body.login, req.body?.pizzaOrder);
const data = removePizzaOrder(login, req.body?.pizzaOrder);
io.emit("message", data);
res.status(200).json({});
});
app.post("/api/lockPizzaDay", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
const data = lockPizzaDay(req.body.login);
const login = getLogin(parseToken(req));
const data = lockPizzaDay(login);
io.emit("message", data);
res.status(200).json({});
});
app.post("/api/unlockPizzaDay", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
const data = unlockPizzaDay(req.body.login);
const login = getLogin(parseToken(req));
const data = unlockPizzaDay(login);
io.emit("message", data);
res.status(200).json({});
});
app.post("/api/finishOrder", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
const data = finishPizzaOrder(req.body.login);
const login = getLogin(parseToken(req));
const data = finishPizzaOrder(login);
io.emit("message", data);
res.status(200).json({});
});
app.post("/api/finishDelivery", (req, res) => {
if (!req.body?.login) {
throw Error("Nebyl předán login");
}
const data = finishPizzaDelivery(req.body.login, req.body.bankAccount, req.body.bankAccountHolder);
const login = getLogin(parseToken(req));
const data = finishPizzaDelivery(login, req.body.bankAccount, req.body.bankAccountHolder);
io.emit("message", data);
res.status(200).json({});
});
app.post("/api/updateChoice", (req, res) => {
if (!req.body.hasOwnProperty('name')) {
res.status(400).json({});
}
const data = updateChoice(req.body.name, req.body.choice);
const login = getLogin(parseToken(req));
const data = updateChoice(login, req.body.choice);
io.emit("message", data);
res.status(200).json(data);
});
app.get("/api/qr", (req, res) => {
if (!req.query?.login || typeof req.query.login !== 'string') {
throw Error("Nebyl předán login");
}
const img = getQr(req.query.login);
const login = getLogin(parseToken(req));
const img = getQr(login);
res.writeHead(200, {
'Content-Type': 'image/png',
'Content-Length': img.length
@@ -168,13 +180,11 @@ app.get("/api/qr", (req, res) => {
});
app.post("/api/updateNote", (req, res) => {
if (!req.body.login) {
throw Error("Nebyl předán login");
}
const login = getLogin(parseToken(req));
if (req.body.note && req.body.note.length > 100) {
throw Error("Poznámka může mít maximálně 100 znaků");
}
const data = updateNote(req.body.login, req.body.note);
const data = updateNote(login, req.body.note);
io.emit("message", data);
res.status(200).json(data);
});