33 lines
1.0 KiB
TypeScript
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;
|
|
}
|
|
}
|