44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import type { MiddlewareHandler } from 'hono';
|
|
import { auth } from '@/modules/auth/auth';
|
|
import type { BackendEnv } from './env';
|
|
import { problemJson, unauthorizedProblem } from './problem-details';
|
|
|
|
export const sessionAuthMiddleware: MiddlewareHandler<BackendEnv> = async (c, next) => {
|
|
if (isPublicApiRequest(c.req.method, c.req.path)) {
|
|
await next();
|
|
return;
|
|
}
|
|
|
|
const session = await auth.api.getSession({ headers: c.req.raw.headers });
|
|
if (!session) {
|
|
return problemJson(c, unauthorizedProblem(c.req.path));
|
|
}
|
|
|
|
c.set('user', session.user);
|
|
c.set('session', session.session);
|
|
|
|
await next();
|
|
};
|
|
|
|
export function isPublicApiRequest(method: string, path: string): boolean {
|
|
if (method === 'OPTIONS') {
|
|
return true;
|
|
}
|
|
|
|
const normalizedPath = normalizePath(path);
|
|
|
|
return (
|
|
normalizedPath === '/api/v1/health'
|
|
|| matchesPublicPrefix(normalizedPath, '/api/v1/auth')
|
|
|| matchesPublicPrefix(normalizedPath, '/api/auth')
|
|
|| matchesPublicPrefix(normalizedPath, '/api/v1/invitations')
|
|
);
|
|
}
|
|
|
|
function matchesPublicPrefix(path: string, prefix: string): boolean {
|
|
return path === prefix || path.startsWith(`${prefix}/`);
|
|
}
|
|
|
|
function normalizePath(path: string): string {
|
|
return path.length > 1 && path.endsWith('/') ? path.slice(0, -1) : path;
|
|
} |