Formatting + Added Home Page

This commit is contained in:
IM23a-spirgif
2025-04-17 14:21:05 +02:00
parent 2d41fea0f1
commit bf2266af9b
3 changed files with 41 additions and 23 deletions
+20 -20
View File
@@ -34,7 +34,7 @@ function saveUser(user) {
} }
function generateAccessToken(user) { function generateAccessToken(user) {
return jwt.sign(user, process.env.TOKEN_SECRET, { expiresIn: "1800s" }); return jwt.sign(user, process.env.TOKEN_SECRET, {expiresIn: "1800s"});
} }
function authenticateToken(request, response, next) { function authenticateToken(request, response, next) {
@@ -53,7 +53,7 @@ function authenticateToken(request, response, next) {
const users = get_data(); const users = get_data();
const foundUser = users.find(u => u.username === user.username); const foundUser = users.find(u => u.username === user.username);
if (!foundUser || foundUser.token !== token) { if (!foundUser || foundUser.token !== token) {
return response.status(403).json({ error: "Token has been revoked or is invalid" }); return response.status(403).json({error: "Token has been revoked or is invalid"});
} }
request.user = user; request.user = user;
@@ -62,45 +62,45 @@ function authenticateToken(request, response, next) {
} }
app.post("/register", (request, response) => { app.post("/register", (request, response) => {
let { username, password } = request.body; let {username, password} = request.body;
username = username.toLowerCase(); let lower_username = username.toLowerCase();
if (!username || !password) if (!username || !password)
return response.status(400).json({ error: "Username and password are required" }); return response.status(400).json({error: "Username and password are required"});
const users = get_data(); const users = get_data();
if (users.some(u => u.username === username)) { if (users.some(u => u.username === username)) {
return response.status(400).json({ error: "Username already exists" }); return response.status(400).json({error: "Username already exists"});
} }
const token = generateAccessToken({ username }); const token = generateAccessToken({username});
saveUser({ username, password, token, "money": 200 }); saveUser({username, password, token, "money": 200});
response.json({ lower_username, token }); response.json({lower_username, token});
}); });
app.get("/login", (request, response) => { app.get("/login", (request, response) => {
response.sendFile(path.join(__dirname, ".\\public\\login.html")); response.sendFile(path.join(__dirname, ".\\public\\login.html"));
}) })
app.post("/login", (request, response) => { app.post("/login", (request, response) => {
let { username, password } = request.body; let {username, password} = request.body;
username = username.toLowerCase(); username = username.toLowerCase();
if (!username || !password) if (!username || !password)
return response.status(400).json({ error: "Username and password are required" }); return response.status(400).json({error: "Username and password are required"});
const users = get_data(); const users = get_data();
const user = users.find(u => u.username === username); const user = users.find(u => u.username === username);
if (!user) return response.status(401).json({ error: "Invalid credentials" }); if (!user) return response.status(401).json({error: "Invalid credentials"});
if (user.password !== password) { if (user.password !== password) {
response.status(401).json({ error: "Invalid password" }); response.status(401).json({error: "Invalid password"});
} }
const token = generateAccessToken({ username }); const token = generateAccessToken({username});
user.token = token; user.token = token;
save_data(users); save_data(users);
response.json({ username, token }); response.json({username, token});
}); });
app.get("/", authenticateToken, (request, response) => { app.get("/", authenticateToken, (request, response) => {
@@ -120,14 +120,14 @@ app.get("/balance", authenticateToken, (request, response) => {
const me = allUsers.find(u => u.username === username); const me = allUsers.find(u => u.username === username);
if (!me) { if (!me) {
return response.status(404).json({ error: "User not found" }); return response.status(404).json({error: "User not found"});
} }
response.json({ balance: me.money }).status(200); response.json({balance: me.money}).status(200);
}); });
app.post("/verify", authenticateToken, (request, response) => { app.post("/verify", authenticateToken, (request, response) => {
response.json({ valid: true, user: request.user }); response.json({valid: true, user: request.user});
}); });
app.delete("/logout", authenticateToken, (request, response) => { app.delete("/logout", authenticateToken, (request, response) => {
@@ -139,7 +139,7 @@ app.delete("/logout", authenticateToken, (request, response) => {
const user = users.find(u => u.username === username); const user = users.find(u => u.username === username);
// 1) Clear the HttpOnly cookie in the browser // 1) Clear the HttpOnly cookie in the browser
response.clearCookie("token", { response.clearCookie("authorization", {
httpOnly: true, httpOnly: true,
secure: process.env.NODE_ENV === "production", secure: process.env.NODE_ENV === "production",
sameSite: "Strict" sameSite: "Strict"
@@ -152,7 +152,7 @@ app.delete("/logout", authenticateToken, (request, response) => {
} }
// 3) Send final response // 3) Send final response
response.json({ message: "Logged out successfully." }); response.json({message: "Logged out successfully."});
}); });
app.listen(port, () => { app.listen(port, () => {
+20
View File
@@ -16,4 +16,24 @@ document.addEventListener("DOMContentLoaded", async () => {
} catch (error) { } catch (error) {
console.log(error); console.log(error);
} }
logoutButton.addEventListener("click", async (e) => {
e.preventDefault();
try {
const logoutRes = await fetch('/logout', {
method: "DELETE",
headers: {
"Content-Type": "application/json",
}
});
if (logoutRes.ok) {
document.cookie = "authorization=; Max-Age=0; path=/;";
window.location.href = "/login";
} else {
console.log("Failed to logout");
}
} catch (err) {
console.log("Logout error:", err);
}
});
}); });
+1 -3
View File
@@ -3,11 +3,9 @@
form.addEventListener("submit", async (e) => { form.addEventListener("submit", async (e) => {
e.preventDefault(); e.preventDefault();
const username = form.username.value; const username = form.username.value;
const password = form.password.value; const password = form.password.value;
const credentials = {username, password}; const credentials = {username, password};
try { try {
const loginRes = await fetch("/login", { const loginRes = await fetch("/login", {
method: "POST", method: "POST",
@@ -17,7 +15,7 @@
if (loginRes.ok) { if (loginRes.ok) {
const loginData = await loginRes.json(); const loginData = await loginRes.json();
alert(`Welcome back, ${loginData.username}!`); alert(`Welcome back, ${loginData.lower_username}!`);
document.cookie = `authorization=${loginData.token}` document.cookie = `authorization=${loginData.token}`
window.location.href = "/"; window.location.href = "/";
return; return;