37 lines
860 B
TypeScript
37 lines
860 B
TypeScript
import * as jose from "jose";
|
|
import { env } from "./env";
|
|
|
|
const JWT_ALG = "HS256";
|
|
|
|
export interface SessionPayload {
|
|
userId: number;
|
|
}
|
|
|
|
export async function signSessionToken(
|
|
payload: SessionPayload,
|
|
): Promise<string> {
|
|
const secret = new TextEncoder().encode(env.appSecret);
|
|
return new jose.SignJWT(payload)
|
|
.setProtectedHeader({ alg: JWT_ALG })
|
|
.setIssuedAt()
|
|
.setExpirationTime("1 year")
|
|
.sign(secret);
|
|
}
|
|
|
|
export async function verifySessionToken(
|
|
token: string,
|
|
): Promise<SessionPayload | null> {
|
|
if (!token) return null;
|
|
try {
|
|
const secret = new TextEncoder().encode(env.appSecret);
|
|
const { payload } = await jose.jwtVerify(token, secret, {
|
|
algorithms: [JWT_ALG],
|
|
});
|
|
const userId = payload.userId as number;
|
|
if (!userId) return null;
|
|
return { userId };
|
|
} catch {
|
|
return null;
|
|
}
|
|
}
|