javascript - Hvordan oppretter jeg en cookie i Svelte og får tilgang til den?
Jeg prøver å lage en cookie i Svelte (og jeg bruker også Svelte Kit) og få tilgang til den. Jeg ønsker å bruke cookien til autentiseringsformål, mer spesifikt for å lagre en JWT-token.
Jeg har prøvd å implementere ren JS-kode, slik som getCookie() og setCookie() som vist her W3Schools - JavaScript Cookies. Men jeg får ikke tilgang til dokumentet. Jeg har også prøvd å serialisere fra cookie npm-pakken, som vist under, og jeg har også prøvd å bruke nettleseren som vist nedenfor.
import { serialize } from "cookie";
import { browser } from '$app/environment';
Svar #1
Du kan for eksempel sette en informasjonskapsel i en skjema-handling. Hvis du vil kunne lese den i nettleseren, må du deaktivere HttpOnly (generelt bør du unngå dette, da det gjør sårbarheter for cross site scripting værre).
Et enkelt eksempel:
<!-- +page.svelte -->
<script lang="ts">
import { enhance } from '$app/forms';
export let form: { error?: string; } | null;
</script>
<form method="post" use:enhance>
<label>Login <input type="text" name="login" /></label>
<label>Password <input type="password" name="password" /></label>
{#if form?.error}<p>{form.error}</p>{/if}
<button type="submit">Login</button>
</form>
// +page.server.ts
import { fail, redirect } from '@sveltejs/kit';
import type { Actions } from './$types';
export const actions: Actions = {
default: async ({ request, cookies }) => {
const formData = await request.formData();
const login = formData.get('login');
const password = formData.get('password');
if (login == 'admin' && password == '...') {
cookies.set(
'auth', '42',
{
path: '/',
maxAge: 60 * 60 * 24 * 365,
httpOnly: false, // <-- if you want to read it in the browser
},
);
redirect(302, '/');
}
return fail(400, { error: 'Invalid login or password' });
},
}
Informasjonskapselen kan leses fra document.cookie, merk at dette vil gi en feil under SSR, så du må sjekke browser eller lese den i onMount.
Svar #2
Hvis du vil sette det i en script-tag i en fil, må du vente til DOM-en er lastet. Det betyr at du kan få tilgang til document.cookie i en funksjon som kalles av et element, eller du kan bruke onMount-livssyklus.
Noe som dette:
onMount(() => {
document.cookie = "theme=light";
});
Jeg vet at innlegget er gammelt, men det tok meg litt tid å løse dette også. Jeg håper det kan hjelpe noen.
