Files

33 lines
1.0 KiB
TypeScript

import { SignJWT, jwtVerify } from "jose";
export const SESSION_COOKIE = "gt_session";
export type SessionUser = { uid: number; name: string; role: string; tokenVersion: number };
function secret(): Uint8Array {
const s = process.env.SESSION_SECRET ?? "";
if (s.length < 32) throw new Error("SESSION_SECRET zu kurz");
return new TextEncoder().encode(s);
}
export async function createSession(user: SessionUser): Promise<string> {
return new SignJWT({ ...user }).setProtectedHeader({ alg: "HS256" }).setExpirationTime("30d").sign(secret());
}
export async function verifySession(token: string): Promise<SessionUser | null> {
try {
const { payload } = await jwtVerify(token, secret());
if (
typeof payload.uid !== "number" ||
typeof payload.name !== "string" ||
typeof payload.role !== "string" ||
typeof payload.tokenVersion !== "number"
) {
return null;
}
return { uid: payload.uid, name: payload.name, role: payload.role, tokenVersion: payload.tokenVersion };
} catch {
return null;
}
}