-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathauth.ts
More file actions
60 lines (53 loc) · 1.64 KB
/
Copy pathauth.ts
File metadata and controls
60 lines (53 loc) · 1.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
import session from "express-session";
import connectPg from "connect-pg-simple";
import type { Express, Request, Response, NextFunction } from "express";
import { storage } from "./storage";
import type { User } from "@shared/schema";
declare module "express-session" {
interface SessionData {
userId?: number;
userRole?: string;
}
}
export function setupAuth(app: Express) {
const sessionTtl = 7 * 24 * 60 * 60 * 1000; // 1 week
const pgStore = connectPg(session);
const sessionStore = new pgStore({
conString: process.env.DATABASE_URL,
createTableIfMissing: true,
ttl: sessionTtl,
tableName: "sessions",
});
app.use(session({
secret: process.env.SESSION_SECRET || "demplar-character-manager-secret",
store: sessionStore,
resave: false,
saveUninitialized: false,
cookie: {
httpOnly: true,
secure: false, // Set to true in production with HTTPS
maxAge: sessionTtl,
},
}));
}
export async function requireAuth(req: Request, res: Response, next: NextFunction) {
if (!req.session.userId) {
return res.status(401).json({ message: "Authentication required" });
}
const user = await storage.getUser(req.session.userId);
if (!user) {
req.session.destroy(() => {});
return res.status(401).json({ message: "Invalid session" });
}
(req as any).user = user;
next();
}
export async function requireMaster(req: Request, res: Response, next: NextFunction) {
await requireAuth(req, res, () => {
const user = (req as any).user as User;
if (user.role !== "master") {
return res.status(403).json({ message: "Master access required" });
}
next();
});
}