73 lines
1.8 KiB
TypeScript
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;
|