aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Utility/oauth.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2024-01-13 18:58:34 -0800
committerFuwn <[email protected]>2024-01-13 18:58:34 -0800
commitf7a8c246f5723aae42a38bb88631893bb1b24d6e (patch)
treef7915250f57fde62fd72a351ffd6e79f0692292e /src/lib/Utility/oauth.ts
parentrefactor(utility): move loading (diff)
downloaddue.moe-f7a8c246f5723aae42a38bb88631893bb1b24d6e.tar.xz
due.moe-f7a8c246f5723aae42a38bb88631893bb1b24d6e.zip
refactor(utility): move helpers to utility
Diffstat (limited to 'src/lib/Utility/oauth.ts')
-rw-r--r--src/lib/Utility/oauth.ts52
1 files changed, 52 insertions, 0 deletions
diff --git a/src/lib/Utility/oauth.ts b/src/lib/Utility/oauth.ts
new file mode 100644
index 00000000..1c35223d
--- /dev/null
+++ b/src/lib/Utility/oauth.ts
@@ -0,0 +1,52 @@
+import { dev } from '$app/environment';
+import { redirect, type Cookies } from '@sveltejs/kit';
+
+export interface ClientOptions {
+ id: string;
+ secret: string;
+ redirectURI: string;
+}
+
+export interface CallbackOptions {
+ url: URL;
+ cookies: Cookies;
+ cookie: string;
+ authorise: string;
+ redirect?: string;
+ client: ClientOptions;
+ verifier?: string;
+}
+
+export const callback = async (options: CallbackOptions) => {
+ const { url, cookies, cookie, authorise, client } = options;
+ const formData = new FormData();
+
+ formData.append('grant_type', 'authorization_code');
+ formData.append('client_id', client.id);
+ formData.append('client_secret', client.secret);
+ formData.append('redirect_uri', client.redirectURI);
+ formData.append('code', url.searchParams.get('code') || 'null');
+
+ if (options.verifier) formData.append('code_verifier', options.verifier);
+
+ cookies.set(
+ cookie,
+ JSON.stringify(
+ await (
+ await fetch(authorise, {
+ method: 'POST',
+ body: formData
+ })
+ ).json()
+ ),
+ {
+ path: '/',
+ maxAge: 60 * 60 * 24 * 7,
+ httpOnly: true,
+ sameSite: 'lax',
+ secure: !dev
+ }
+ );
+
+ throw redirect(303, options.redirect ?? '/');
+};