암호 키 유무에 따른 자동 리다이렉션 구현

This commit is contained in:
static
2024-12-28 18:55:20 +09:00
parent 173f4f5cfe
commit dfb56b62b1
4 changed files with 29 additions and 8 deletions

View File

@@ -9,8 +9,7 @@ export const init: ServerInit = () => {
};
export const handle: Handle = async ({ event, resolve }) => {
const path = event.url.pathname;
if (path.startsWith("/api") || path.startsWith("/auth")) {
if (["/api", "/auth"].some((path) => event.url.pathname.startsWith(path))) {
return await resolve(event);
}
@@ -18,6 +17,9 @@ export const handle: Handle = async ({ event, resolve }) => {
if (accessToken) {
return await resolve(event);
} else {
redirect(302, "/auth/login?redirect=" + encodeURIComponent(path));
redirect(
302,
"/auth/login?redirect=" + encodeURIComponent(event.url.pathname + event.url.search),
);
}
};

View File

@@ -1,8 +1,10 @@
<script lang="ts">
import { get } from "svelte/store";
import { goto } from "$app/navigation";
import { Button, TextButton } from "$lib/components/buttons";
import { TitleDiv, BottomDiv } from "$lib/components/divs";
import { TextInput } from "$lib/components/inputs";
import { keyPairStore } from "$lib/stores";
import { requestLogin } from "./service";
let { data } = $props();
@@ -13,9 +15,12 @@
const login = async () => {
// TODO: Validation
const ok = await requestLogin(email, password);
if (ok) {
goto(data.redirectPath);
if (await requestLogin(email, password)) {
await goto(
get(keyPairStore)
? data.redirectPath
: "/key/generate?redirect=" + encodeURIComponent(data.redirectPath),
);
} else {
// TODO: Alert
}

View File

@@ -1,4 +1,3 @@
import { storeKeyPairIntoIndexedDB } from "$lib/indexedDB";
import { keyPairStore } from "$lib/stores";
type KeyType = "public" | "private";
@@ -48,7 +47,6 @@ export const generateKeyPair = async () => {
publicKey: keyPair.publicKey,
privateKey: privKeySecured,
});
await storeKeyPairIntoIndexedDB(keyPair.publicKey, privKeySecured);
return {
pubKeyBase64: await exportKeyToBase64(keyPair.publicKey, "public"),

View File

@@ -1,6 +1,22 @@
<script lang="ts">
import { onMount } from "svelte";
import { goto } from "$app/navigation";
import { getKeyPairFromIndexedDB } from "$lib/indexedDB";
import { keyPairStore } from "$lib/stores";
import "../app.css";
let { children } = $props();
onMount(async () => {
const { pubKey, privKey } = await getKeyPairFromIndexedDB();
if (pubKey && privKey) {
keyPairStore.set({ publicKey: pubKey, privateKey: privKey });
} else if (!["/auth", "/key/generate"].some((path) => location.pathname.startsWith(path))) {
await goto(
"/key/generate?redirect=" + encodeURIComponent(location.pathname + location.search),
);
}
});
</script>
{@render children()}