Files
2026-04-10 14:40:11 +07:00

62 lines
1.6 KiB
TypeScript

export default defineEventHandler(async (event) => {
const parseJwtPayload = (token: string): { exp?: number } | null => {
try {
const payload = token.split('.')[1];
if (!payload) return null;
const decoded = Buffer.from(payload, 'base64').toString();
return JSON.parse(decoded) as { exp?: number };
} catch {
return null;
}
};
const sessionId = getCookie(event, "user_session");
if (!sessionId) {
throw createError({
statusCode: 401,
statusMessage: "No session cookie found",
});
}
try {
// Get session from server-side store using session ID
const { getUserSession, deleteUserSession } = await import('~/server/utils/sessionStore');
const session = getUserSession(sessionId);
if (!session) {
throw createError({
statusCode: 401,
statusMessage: "Session expired or invalid",
});
}
const accessPayload = parseJwtPayload(session.accessToken);
const nowInSeconds = Math.floor(Date.now() / 1000);
if (!accessPayload?.exp || accessPayload.exp <= nowInSeconds) {
deleteUserSession(sessionId);
throw createError({
statusCode: 401,
statusMessage: "Access token expired or invalid",
});
}
return {
...session,
payloadIdToken : session.idToken ? parseJwtPayload(session.idToken) : null,
payloadAccessToken: accessPayload
};
} catch (error: any) {
if (error?.statusCode) {
throw error;
}
console.error("❌ Failed to validate session:", error);
throw createError({
statusCode: 401,
statusMessage: "Invalid session data",
});
}
});