Rhys Sullivanpr cleanup0c5fbd72 years agoHistory
59 lines · 1.5 KB · TypeScript
RawDownload
import { NewUser } from "@/db/schema";import { compare, hash } from "bcryptjs";import { SignJWT, jwtVerify } from "jose";import { cookies } from "next/headers"; const key = new TextEncoder().encode(process.env.AUTH_SECRET);const SALT_ROUNDS = 10; export async function hashPassword(password: string) {  return hash(password, SALT_ROUNDS);} export async function comparePasswords(  plainTextPassword: string,  hashedPassword: string,) {  return compare(plainTextPassword, hashedPassword);} type SessionData = {  user: { id: number };  expires: string;}; export async function signToken(payload: SessionData) {  return await new SignJWT(payload)    .setProtectedHeader({ alg: "HS256" })    .setIssuedAt()    .setExpirationTime("1 day from now")    .sign(key);} export async function verifyToken(input: string) {  const { payload } = await jwtVerify(input, key, {    algorithms: ["HS256"],  });  return payload as SessionData;} export async function getSession() {  const session = (await cookies()).get("session")?.value;  if (!session) return null;  return await verifyToken(session);} export async function setSession(user: NewUser) {  const expiresInOneDay = new Date(Date.now() + 24 * 60 * 60 * 1000);  const session: SessionData = {    user: { id: user.id! },    expires: expiresInOneDay.toISOString(),  };  const encryptedSession = await signToken(session);  (await cookies()).set("session", encryptedSession, {    expires: expiresInOneDay,    httpOnly: true,    secure: true,    sameSite: "lax",  });}