diff --git a/backend/app/main.py b/backend/app/main.py index b36e999..5a69345 100644 --- a/backend/app/main.py +++ b/backend/app/main.py @@ -1,5 +1,6 @@ from dotenv import load_dotenv from fastapi import APIRouter, FastAPI +from fastapi.middleware.cors import CORSMiddleware from starlette.middleware.authentication import AuthenticationMiddleware load_dotenv() @@ -47,6 +48,19 @@ def create_app(): app.include_router(api_v1_router) app.mount(path="/v1/ocpp", app=create_ocpp_app()) + origins = [ + "http://localhost", + "http://localhost:5173", + ] + + app.add_middleware( + CORSMiddleware, + allow_origins=origins, + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], + ) + return app app = create_app() diff --git a/frontend/src/lib/axios.ts b/frontend/src/lib/axios.svelte.ts similarity index 71% rename from frontend/src/lib/axios.ts rename to frontend/src/lib/axios.svelte.ts index dd520c4..30f2104 100644 --- a/frontend/src/lib/axios.ts +++ b/frontend/src/lib/axios.svelte.ts @@ -1,6 +1,8 @@ import axios from 'axios'; import { dev } from '$app/environment'; import { goto } from '$app/navigation'; +import { get } from 'svelte/store'; +import { persistentSettings } from '$lib/persistent-store'; if (dev) { axios.defaults.baseURL = "http://localhost:8000/api/v1" @@ -28,11 +30,17 @@ function createTokenRefreshInterceptor() { return axios .post("/auth/refresh", { - refresh_token: "", + refresh_token: get(persistentSettings).refreshToken, }) .then((response) => { - // TODO: Save token - error.response.config.headers["Authorization"] = "Bearer " + response.data.access_token; + // Save new refresh token + persistentSettings.update(setting=> setting.refreshToken=response.data.refresh_token) + + // Update access token + const authHeader = "Bearer " + response.data.access_token; + axios.defaults.headers.common['Authorization'] = authHeader; + error.response.config.headers["Authorization"] = authHeader; + // Retry initial request with new token return axios(error.response.config); }) @@ -48,3 +56,5 @@ function createTokenRefreshInterceptor() { } createTokenRefreshInterceptor(); + +export default axios; diff --git a/frontend/src/routes/(navbar)/+layout.svelte b/frontend/src/routes/(navbar)/+layout.svelte index 191f2f6..9049bcf 100644 --- a/frontend/src/routes/(navbar)/+layout.svelte +++ b/frontend/src/routes/(navbar)/+layout.svelte @@ -2,6 +2,8 @@ import { goto } from '$app/navigation' import { persistentSettings } from '$lib/persistent-store' import i18n from '$lib/i18n' + import axios from '$lib/axios.svelte' + let { children } = $props() if (!$persistentSettings.loggedIn) { @@ -9,6 +11,17 @@ } let drawerOpen = $state(false) + + function logout() { + axios.post('/auth/logout').then(() => { + $persistentSettings.email = '' + $persistentSettings.friendlyName = '' + $persistentSettings.loggedIn = false + $persistentSettings.refreshToken = '' + $persistentSettings.role = 'member' + goto('/login?logout') + }) + }
@@ -86,7 +99,7 @@ class="menu menu-sm dropdown-content bg-base-100 rounded-box z-1 mt-3 w-52 p-2 shadow" >
  • {$i18n.t('common:navbar.link.profile')}
  • -
  • {$i18n.t('common:navbar.link.logout')}
  • +
  • diff --git a/frontend/src/routes/login/+page.svelte b/frontend/src/routes/login/+page.svelte index 038f95f..1e2457a 100644 --- a/frontend/src/routes/login/+page.svelte +++ b/frontend/src/routes/login/+page.svelte @@ -1,6 +1,9 @@
    @@ -30,13 +56,18 @@
    - +