mirror of
https://github.com/nicotsx/ironmount.git
synced 2025-12-10 12:10:51 +01:00
64 lines
1.4 KiB
TypeScript
64 lines
1.4 KiB
TypeScript
import { deleteCookie, getCookie } from "hono/cookie";
|
|
import { createMiddleware } from "hono/factory";
|
|
import { authService } from "./auth.service";
|
|
|
|
const COOKIE_NAME = "session_id";
|
|
const COOKIE_OPTIONS = {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === "production",
|
|
sameSite: "lax" as const,
|
|
path: "/",
|
|
};
|
|
|
|
declare module "hono" {
|
|
interface ContextVariableMap {
|
|
user: {
|
|
id: number;
|
|
username: string;
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Middleware to require authentication
|
|
* Verifies the session cookie and attaches user to context
|
|
*/
|
|
export const requireAuth = createMiddleware(async (c, next) => {
|
|
const sessionId = getCookie(c, COOKIE_NAME);
|
|
|
|
if (!sessionId) {
|
|
return c.json({ message: "Authentication required" }, 401);
|
|
}
|
|
|
|
const session = await authService.verifySession(sessionId);
|
|
|
|
if (!session) {
|
|
deleteCookie(c, COOKIE_NAME, COOKIE_OPTIONS);
|
|
return c.json({ message: "Invalid or expired session" }, 401);
|
|
}
|
|
|
|
c.set("user", session.user);
|
|
|
|
await next();
|
|
});
|
|
|
|
/**
|
|
* Middleware to optionally attach user if authenticated
|
|
* Does not block the request if not authenticated
|
|
*/
|
|
export const optionalAuth = createMiddleware(async (c, next) => {
|
|
const sessionId = getCookie(c, COOKIE_NAME);
|
|
|
|
if (sessionId) {
|
|
const session = await authService.verifySession(sessionId);
|
|
|
|
if (session) {
|
|
c.set("user", session.user);
|
|
} else {
|
|
deleteCookie(c, COOKIE_NAME, COOKIE_OPTIONS);
|
|
}
|
|
}
|
|
|
|
await next();
|
|
});
|