aboutsummaryrefslogtreecommitdiffstats
path: root/src/routes/login/callback
diff options
context:
space:
mode:
authorLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-08-20 13:39:01 +0200
committerLibravatarLarge Libravatar memdmp <memdmpestrogenzone>2025-08-20 13:39:01 +0200
commitdddef149aea597a145e3717b2c461b251e0f6a8d (patch)
tree0a38a8d48e2db2501caca6d66358a4f88c1b743f /src/routes/login/callback
parent7fdaea73c5c67565202e19d6182fc215427919c3 (diff)
downloadcrunched-dddef149aea597a145e3717b2c461b251e0f6a8d.tar.gz
crunched-dddef149aea597a145e3717b2c461b251e0f6a8d.tar.bz2
crunched-dddef149aea597a145e3717b2c461b251e0f6a8d.tar.lz
crunched-dddef149aea597a145e3717b2c461b251e0f6a8d.zip

feat: oidc attempt 82845345

Diffstat (limited to 'src/routes/login/callback')
-rw-r--r--src/routes/login/callback/+server.ts79
-rw-r--r--src/routes/login/callback/ok/+page.svelte13
2 files changed, 45 insertions, 47 deletions
diff --git a/src/routes/login/callback/+server.ts b/src/routes/login/callback/+server.ts
index 32b1647..1de7811 100644
--- a/src/routes/login/callback/+server.ts
+++ b/src/routes/login/callback/+server.ts
@@ -1,5 +1,6 @@
+import { base } from '$app/paths';
import * as auth from '$lib/auth.server.js';
-import { error, json, redirect } from '@sveltejs/kit';
+import { error, isHttpError, isRedirect, json, redirect } from '@sveltejs/kit';
import * as client from 'openid-client';
// Pre-checker for nonce, not the primary implementation
@@ -18,63 +19,47 @@ const handleNonce = (nonce: string | null, nonceCookie: string | undefined) => {
};
export const GET = async (event) => {
const sp = event.url.searchParams;
- const params = {
- sessionState: sp.get('session_state'),
- iss: sp.get('iss'),
- code: sp.get('code'),
- nonce: sp.get('nonce'),
- };
- if (!params.sessionState || !params.iss || !params.code)
- throw error(400, 'Missing one of session_state, iss, code');
const remainingNonces = handleNonce(
- params.nonce,
+ sp.get('nonce'),
event.cookies.get('pending-auth-nonces')
);
try {
- const tk = await auth.authorizeNewSession(
+ const tokens = await auth.authorizeNewSession(
new URL(event.url.href),
- params.nonce ?? undefined
+ sp.get('nonce') ?? undefined
);
- for (const [k, v] of Object.entries({
- oid__access_token: tk.access_token,
- oid__token_type: tk.token_type,
- oid__expires_at: '' + (Date.now() + (tk.expiresIn() ?? 0) * 1000),
- oid__refresh_token: tk.refresh_token,
- oid__sub: tk.claims()!.sub,
- 'pending-auth-nonces': JSON.stringify(remainingNonces),
- }))
- if (v)
- event.cookies.set(k, v, {
- path: '/',
- secure: true,
- httpOnly: true,
- sameSite: true,
- });
- if (tk.scope)
- event.cookies.set('oid__scopes', tk.scope, {
- path: '/',
- secure: true,
- httpOnly: true,
- sameSite: true,
- });
-
- console.warn(
- 'New Session:',
- await client.fetchUserInfo(
- await auth.getConfig(),
- tk.access_token,
- tk.claims()!.sub
- )
- );
+ auth.setCookies(event.cookies, tokens);
+ event.cookies.set('pending-auth-nonces', JSON.stringify(remainingNonces), {
+ path: '/',
+ secure: true,
+ sameSite: true,
+ httpOnly: true,
+ });
- return json({
- sub: tk.claims()!.sub,
- at: tk.access_token,
+ let target = event.cookies.get('next') ?? '/';
+ if (new URL(target, event.url.href).host !== event.url.host) target = '/';
+ event.cookies.delete('next', {
+ path: '/',
});
+ throw redirect(
+ 303,
+ `${base}/login/callback/ok?next=${encodeURIComponent(target)}`
+ );
} catch (e) {
- throw redirect(307, '/login');
+ if (isRedirect(e) || isHttpError(e)) throw e;
+ // @ts-ignore
+ if (e?.cause?.error === 'invalid_grant')
+ throw error(
+ 403,
+ 'Invalid Grant Provided - Does your account have access to all requested resources?'
+ );
+ else
+ throw error(
+ 500,
+ `Could not authorize new session: ${JSON.stringify(e, null, 2)}`
+ );
}
};
diff --git a/src/routes/login/callback/ok/+page.svelte b/src/routes/login/callback/ok/+page.svelte
new file mode 100644
index 0000000..a71d962
--- /dev/null
+++ b/src/routes/login/callback/ok/+page.svelte
@@ -0,0 +1,13 @@
+<script lang="ts">
+ import { page } from '$app/state';
+
+ let target = page.url.searchParams.get('next') ?? '/';
+ if (new URL(target, page.url.href).host !== page.url.host) target = '/';
+</script>
+
+<svelte:head>
+ <meta http-equiv="refresh" content="0.1; url={target}" />
+</svelte:head>
+
+<h2 class="text-xl">Redirecting...</h2>
+<p>If nothing happens, click <a href={target}>here</a>.</p>