Stundenaufzeichnung/src/routes/login/+page.server.ts

73 lines
1.8 KiB
TypeScript

import type { Actions } from "@sveltejs/kit";
import type { PageServerLoad } from "./$types";
import { fail, redirect } from "@sveltejs/kit";
import { base } from "$app/paths"
import { authorize_password } from "$lib/server/auth";
import SessionStore from "$lib/server/session_store";
export const load: PageServerLoad = ({ locals, url }) => {
let redirect_url = url.searchParams.get("redirect") ?? "/";
if (locals.user != null) {
redirect(302, redirect_url);
}
}
export const actions = {
login: async ({ locals, request, cookies, url }) => {
let redirect_url = url.searchParams.get("redirect") ?? "/";
if (locals.user != null) {
redirect(302, redirect_url);
}
const params = await request.formData();
const username = params.get("username") as string | null;
const password = params.get("password") as string | null;
if (username == null || password == null) {
return fail(400, { message: "Invalid request" });
}
const user = await authorize_password(username, password);
if (user == null) {
return fail(403, { message: "Benutzername oder Passwort falsch.", username: username })
}
const expiry_date = new Date(Date.now() + 15*60*1000)
const token = SessionStore.issue_access_token_for_user(user, expiry_date)
cookies.set("session_id", token, {
expires: expiry_date,
httpOnly: true,
secure: true,
sameSite: 'strict',
path: base
})
redirect(302, redirect_url);
},
logout: async ({ locals, cookies }) => {
if (locals.user == null) {
return fail(403, { message: "Not logged in." });
}
const token = cookies.get("session_id");
if (!token) {
console.log("how is this user logged in right now?");
return fail(500);
}
SessionStore.logout_user_session(token);
cookies.delete("session_id", { path: base });
return redirect(302, `${base}/login`);
}
} satisfies Actions;