import type {NextFunction, Request, Response} from "express"; import {type JWTPayload, jwtVerify, SignJWT} from "jose"; import env from "dotenv"; env.config(); const secret = new TextEncoder().encode(process.env.SECRET_KEY); export type AuthTokenPayload = JWTPayload & { username: string; }; declare module "express-serve-static-core" { interface Request { user?: AuthTokenPayload; } } export async function generateToken(payload: AuthTokenPayload) { return await new SignJWT(payload) .setProtectedHeader({alg: "HS256"}) .setIssuedAt() .setExpirationTime("24h") .sign(secret); } export async function authenticate(req: Request, res: Response, next: NextFunction) { const authHeader = req.headers["authorization"]; const token = authHeader && authHeader.split(" ")[1]; if (token == null) return res.sendStatus(401); const {payload} = await jwtVerify(token, secret); req.user = payload; next(); }