website/src/lib/guestbookAuth.ts

45 lines
1.2 KiB
TypeScript

import { dev } from "$app/environment";
import { DISCORD_CLIENT_ID, GITHUB_CLIENT_ID } from "$env/static/private";
import { PUBLIC_BASE_URL } from "$env/static/public";
import type { Cookies } from "@sveltejs/kit";
import { Discord, generateState, GitHub } from "arctic";
export const callbackUrl = `${PUBLIC_BASE_URL}/guestbook/`
export const discord = new Discord(DISCORD_CLIENT_ID, "", callbackUrl)
export const github = new GitHub(GITHUB_CLIENT_ID, "", callbackUrl)
export const createAuthUrl = (authCb: (state: string) => URL, cookies: Cookies) => {
const state = generateState()
const url = authCb(state)
cookies.set("state", state, {
secure: !dev,
path: "/guestbook/",
httpOnly: true,
maxAge: 60 * 10,
})
return url
}
export const extractCode = (url: URL, cookies: Cookies) => {
const code = url.searchParams.get("code");
const state = url.searchParams.get("state");
const storedState = cookies.get("state");
if (code === null || state === null) {
return null
}
if (state !== storedState) {
throw new Error("Invalid OAuth request");
}
return code
}
export default {
callbackUrl,
discord, github,
createAuthUrl,
extractCode,
}