Files
Console/server/auth.js
2025-12-24 03:21:22 -06:00

81 lines
2.4 KiB
JavaScript

import dotenv from "dotenv"
import jwt from 'jsonwebtoken'
import argon2 from 'argon2'
dotenv.config();
export default class AuthHandler {
ips = new Map()
#secret
constructor() {
this.#secret = process.env.JWT_SECRET;
}
isLoggedInUser(req, res) {
const token = req.cookies.auth_token;
if (!token) {
return false;
}
try {
const decoded = jwt.verify(token, process.env.JWT_SECRET);
req.user = decoded;
return true;
} catch (err) {
return false;
}
}
getProfile(req, res) {
const token = req.cookies.auth_token;
if (!token) return res.status(401).send({ error: "No auth token" });
try {
const payload = jwt.verify(token, process.env.JWT_SECRET);
const email = payload.email;
res.send({ email: "sam@hyperia.so", name: "Sam Russell" });
} catch (err) {
res.status(401).send({ error: "Invalid token" });
}
}
async login(req, res) {
const { password } = req.body;
if (!(password === process.env.PASSWORD)) {
res.status(400).json({ error: 'Incorrect password.' });
} else {
const payload = { email: "sam@hyperia.so" };
console.log(payload)
const secret = process.env.JWT_SECRET;
const options = { expiresIn: "2h" };
const token = jwt.sign(payload, secret, options);
res.cookie("auth_token", token, {
httpOnly: true, // cannot be accessed by JS
secure: process.env.ENV === "production", // only over HTTPS
sameSite: "lax", // like SameSiteLaxMode
maxAge: 2 * 60 * 60 * 1000, // 2 hours in milliseconds
path: "/", // available on entire site
domain: process.env.ENV === "production" ? process.env.BASE_URL : undefined
});
res.redirect("/")
}
}
logout(req, res) {
res.cookie('auth_token', '', {
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 0, // expire immediately
path: '/',
domain: process.env.ENV === "production" ? "." + process.env.BASE_URL : undefined
});
res.redirect("/")
}
}