45 lines
1.2 KiB
TypeScript
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,
|
|
} |