diff --git a/.gitignore b/.gitignore index 0a8440b5..ff5573b9 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,6 @@ dist/ # generated types .astro/ -# vscode -.vscode - # dependencies node_modules/ diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..1f926c5b --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,5 @@ +{ + "i18n-ally.localesPaths": [ + "public/locales" + ] +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 00000000..7832952e --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,12 @@ +{ + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "Docker Container Starten", + "type": "shell", + "command": "docker-compose up" + } + ] +} \ No newline at end of file diff --git a/astro.config.mjs b/astro.config.mjs index 180178ec..af8e2b7b 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -15,6 +15,11 @@ export default defineConfig({ integrations: [/*astroI18next(),*/svelte(), tailwind(), mdx()], outDir: "./dist", output: "server", + vite: { + optimizeDeps: { + exclude: ["@ibcornelsen/api"] + } + }, adapter: node({ mode: "middleware" }), diff --git a/src/components/Header.astro b/src/components/Header.astro index 739fa874..38ca16b1 100644 --- a/src/components/Header.astro +++ b/src/components/Header.astro @@ -1,11 +1,7 @@ --- -// import i18next from "i18next"; -// import {localizeUrl} from "astro-i18next" -// import { t } from "i18next"; -import { isLoggedIn } from "../lib/UI/isLoggedIn"; -// import LanguageDropdown from "./LanguageDropdown.svelte"; +import { validateAccessTokenServer } from "#lib/validateAccessToken" -const loggedIn = isLoggedIn(Astro); +const valid = await validateAccessTokenServer(Astro) ---
@@ -60,7 +56,7 @@ const loggedIn = isLoggedIn(Astro); > AGB { - loggedIn ? ( + valid ? ( Profil diff --git a/src/lib/validateAccessToken.ts b/src/lib/validateAccessToken.ts index 6c4e7730..4bca1aba 100644 --- a/src/lib/validateAccessToken.ts +++ b/src/lib/validateAccessToken.ts @@ -1,8 +1,49 @@ import Cookies from "js-cookie"; import { API_ACCESS_TOKEN_COOKIE_NAME, API_REFRESH_TOKEN_COOKIE_NAME } from "./constants"; import { client } from "src/trpc"; +import { AstroCookies, AstroGlobal } from "astro"; +import { createCaller } from "./caller"; -export async function validateAccessToken() { +export async function validateAccessTokenServer(astro: Readonly>>) { + const accessToken = astro.cookies.get(API_ACCESS_TOKEN_COOKIE_NAME).value; + const refreshToken = astro.cookies.get(API_REFRESH_TOKEN_COOKIE_NAME).value; + + if (accessToken) { + return true; + } + + // Wir haben keinen Access Token mehr, vielleicht ist dieser ausgelaufen. + // Schauen wir mal, ob wir einen Refresh Token haben. + + if (!refreshToken) { + // Wir haben keinen Refresh Token, also müssen wir uns neu anmelden. + return false; + } + + // Wir haben einen Refresh Token, also versuchen wir uns damit anzumelden. + // Wenn das klappt, dann haben wir auch einen neuen Access Token. + // Wenn das nicht klappt, dann müssen wir uns neu anmelden. + try { + const { accessToken: newAccessToken, exp } = await createCaller(astro).v1.benutzer.getAccessToken.query({ + refreshToken + }) + + const options = { + domain: `.${window.location.hostname}`, + path: "/", + expires: exp + } + + astro.cookies.set(API_ACCESS_TOKEN_COOKIE_NAME, newAccessToken, options); + return true; + } catch (e) { + astro.cookies.delete(API_ACCESS_TOKEN_COOKIE_NAME); + astro.cookies.delete(API_REFRESH_TOKEN_COOKIE_NAME); + return false; + } +} + +export async function validateAccessTokenClient() { const accessToken = Cookies.get(API_ACCESS_TOKEN_COOKIE_NAME); const refreshToken = Cookies.get(API_REFRESH_TOKEN_COOKIE_NAME); diff --git a/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte b/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte index f00aaa4a..774881f1 100644 --- a/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte +++ b/src/modules/Ausweise/VerbrauchsausweisWohnenModule.svelte @@ -20,7 +20,7 @@ import Overlay from "#components/Overlay.svelte"; import EmbeddedAuthFlowModule from "#modules/EmbeddedAuthFlowModule.svelte"; import AusweisGespeichertModule from "./AusweisGespeichertModule.svelte"; - import { validateAccessToken } from "#lib/validateAccessToken"; + import { validateAccessTokenClient } from "#lib/validateAccessToken"; export let uid: string | null = null; export let gebaeude: GebaeudeStammdaten = {} as GebaeudeStammdaten; @@ -32,7 +32,7 @@ // Um einen Ausweis zu speichern müssen wir eingeloggt sein, andernfalls wird die API den call ablehnen. // Wir prüfen also ob wir eingeloggt sind und leiten den Nutzer ggf. auf die Login Seite weiter. - if (!await validateAccessToken()) { + if (!await validateAccessTokenClient()) { loginOverlayHidden = false; return } diff --git a/src/pages/login.astro b/src/pages/login.astro index 03dba960..325e183c 100644 --- a/src/pages/login.astro +++ b/src/pages/login.astro @@ -1,7 +1,13 @@ --- -import moment from "moment"; import LoginModule from "../modules/LoginModule.svelte"; import Layout from "../layouts/Layout.astro"; +import { validateAccessTokenServer } from "#lib/validateAccessToken"; + +const valid = await validateAccessTokenServer(Astro) + +if (valid) { + return Astro.redirect("/user") +} const redirect = Astro.url.searchParams.get("redirect") ---