From 15c55cc6924cbf4c174200353a7ab2fbc73e4d1d Mon Sep 17 00:00:00 2001 From: ddelpiano Date: Wed, 21 May 2025 15:53:04 +0200 Subject: [PATCH 1/6] fixes on logout and login for cookies --- nginx/default.conf | 2 ++ src/components/Header/index.jsx | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/nginx/default.conf b/nginx/default.conf index 4e3a4109..dad22bde 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -23,6 +23,7 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Cookie ""; proxy_ssl_verify off; } @@ -32,6 +33,7 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Cookie ""; proxy_ssl_verify off; } diff --git a/src/components/Header/index.jsx b/src/components/Header/index.jsx index 953ee456..9ee96464 100644 --- a/src/components/Header/index.jsx +++ b/src/components/Header/index.jsx @@ -221,7 +221,7 @@ const Header = () => { const handleMenuClick = (e, menu) => { if (menu.label === 'Log out') { - userLogout(); + userLogout(user['groupname']); localStorage.removeItem('session'); localStorage.removeItem('settings'); setUserData({}); From ec6714b6bf59f8c4a170395e2f4b3b887ce05aca Mon Sep 17 00:00:00 2001 From: ddelpiano Date: Wed, 21 May 2025 16:07:54 +0200 Subject: [PATCH 2/6] adding cookie to api actions --- src/api/endpoints/apiActions.ts | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/api/endpoints/apiActions.ts b/src/api/endpoints/apiActions.ts index 5210009f..fd4dc1aa 100644 --- a/src/api/endpoints/apiActions.ts +++ b/src/api/endpoints/apiActions.ts @@ -15,6 +15,7 @@ export const createPostRequest = (endpoint: string, contentTyp data: data, headers: { "Content-Type": contentType, + "Cookie": document.cookie }, withCredentials: true }, @@ -37,6 +38,7 @@ export const createGetRequest = (endpoint: string, contentType config.headers = { ...config.headers, "Content-Type": contentType, + "Cookie": document.cookie } } @@ -44,4 +46,4 @@ export const createGetRequest = (endpoint: string, contentType return response; }); } -} \ No newline at end of file +} From 26ee8f56c8e5b011183b40ad8f6b018c7dcbda69 Mon Sep 17 00:00:00 2001 From: ddelpiano Date: Wed, 21 May 2025 16:39:32 +0200 Subject: [PATCH 3/6] adding cookie to api actions 2 --- src/api/endpoints/apiActions.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/api/endpoints/apiActions.ts b/src/api/endpoints/apiActions.ts index fd4dc1aa..b1295411 100644 --- a/src/api/endpoints/apiActions.ts +++ b/src/api/endpoints/apiActions.ts @@ -15,6 +15,8 @@ export const createPostRequest = (endpoint: string, contentTyp data: data, headers: { "Content-Type": contentType, + "Accept": "/", + "Cache-Control": "no-cache", "Cookie": document.cookie }, withCredentials: true @@ -33,11 +35,13 @@ export const createGetRequest = (endpoint: string, contentType signal, withCredentials: true } - + if (contentType) { config.headers = { ...config.headers, "Content-Type": contentType, + "Accept": "/", + "Cache-Control": "no-cache", "Cookie": document.cookie } } From 84d71939566ddc7f84875befa6dd8df344a20b6c Mon Sep 17 00:00:00 2001 From: ddelpiano Date: Wed, 21 May 2025 18:02:26 +0200 Subject: [PATCH 4/6] adding cookie to api actions 3 --- nginx/default.conf | 2 -- src/api/endpoints/apiActions.ts | 6 ------ src/components/Auth/Login.jsx | 1 - 3 files changed, 9 deletions(-) diff --git a/nginx/default.conf b/nginx/default.conf index dad22bde..4e3a4109 100644 --- a/nginx/default.conf +++ b/nginx/default.conf @@ -23,7 +23,6 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Cookie ""; proxy_ssl_verify off; } @@ -33,7 +32,6 @@ server { proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; - proxy_set_header Cookie ""; proxy_ssl_verify off; } diff --git a/src/api/endpoints/apiActions.ts b/src/api/endpoints/apiActions.ts index b1295411..302d05dd 100644 --- a/src/api/endpoints/apiActions.ts +++ b/src/api/endpoints/apiActions.ts @@ -15,9 +15,6 @@ export const createPostRequest = (endpoint: string, contentTyp data: data, headers: { "Content-Type": contentType, - "Accept": "/", - "Cache-Control": "no-cache", - "Cookie": document.cookie }, withCredentials: true }, @@ -40,9 +37,6 @@ export const createGetRequest = (endpoint: string, contentType config.headers = { ...config.headers, "Content-Type": contentType, - "Accept": "/", - "Cache-Control": "no-cache", - "Cookie": document.cookie } } diff --git a/src/components/Auth/Login.jsx b/src/components/Auth/Login.jsx index ddf73e65..3002c0a8 100644 --- a/src/components/Auth/Login.jsx +++ b/src/components/Auth/Login.jsx @@ -62,7 +62,6 @@ const Login = () => { domain: API_CONFIG.BASE_URL.replace(/^https?:\/\//, '').replace(/:\d+$/, ''), secure: false, sameSite: false, - expires, httpOnly: false } ); From 204a2500ba4ce6fb5b912203835b713250162df0 Mon Sep 17 00:00:00 2001 From: ddelpiano Date: Wed, 21 May 2025 18:54:22 +0200 Subject: [PATCH 5/6] adding cookie to api actions 4 --- src/components/Auth/Login.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Auth/Login.jsx b/src/components/Auth/Login.jsx index 3002c0a8..c00b6d43 100644 --- a/src/components/Auth/Login.jsx +++ b/src/components/Auth/Login.jsx @@ -59,7 +59,7 @@ const Login = () => { sessionCookie.value, { path: '/', - domain: API_CONFIG.BASE_URL.replace(/^https?:\/\//, '').replace(/:\d+$/, ''), + // domain: API_CONFIG.BASE_URL.replace(/^https?:\/\//, '').replace(/:\d+$/, ''), secure: false, sameSite: false, httpOnly: false From e118651d12eb16ca5aeebfcb24bc8b5732e31284 Mon Sep 17 00:00:00 2001 From: ddelpiano Date: Wed, 21 May 2025 20:12:02 +0200 Subject: [PATCH 6/6] handling already logged in, alive sessions and more --- src/components/Auth/Login.jsx | 88 +++++++++++++++++++++++++-------- src/components/Header/index.jsx | 14 +++++- 2 files changed, 79 insertions(+), 23 deletions(-) diff --git a/src/components/Auth/Login.jsx b/src/components/Auth/Login.jsx index c00b6d43..edd7d4a4 100644 --- a/src/components/Auth/Login.jsx +++ b/src/components/Auth/Login.jsx @@ -13,11 +13,11 @@ import { import * as yup from "yup"; import FormField from "./UI/Formfield"; import { useCookies } from 'react-cookie'; +import { API_CONFIG } from "../../config"; import { requestUserSettings } from "./utils"; import Checkbox from "@mui/material/Checkbox"; import PasswordField from "./UI/PasswordField"; import { ArrowBack } from "@mui/icons-material"; -import { API_CONFIG } from "../../config"; import { Link, useNavigate } from "react-router-dom"; import { login } from "../../api/endpoints/apiService"; import { GlobalDataContext } from "../../contexts/DataContext"; @@ -36,11 +36,42 @@ const Login = () => { }); const [errors, setErrors] = React.useState({}); const [isLoading, setIsLoading] = React.useState(false); - const [existingCookies, setCookie] = useCookies(['session']); + const [existingCookies, setCookie, removeCookie] = useCookies(['session']); const { setUserData } = React.useContext(GlobalDataContext); const navigate = useNavigate(); + React.useEffect(() => { + (async () => { + const userSettings = JSON.parse(localStorage.getItem(API_CONFIG.SESSION_DATA.SETTINGS)); + if (userSettings) { + try { + const userData = await requestUserSettings(userSettings?.groupname); + setUserData({ + name: userData['groupname'], + id: userData['orcid'], + email: userData?.emails[0]?.email, + role: userData['own-role'], + groupname: userData['groupname'], + settings: userData + }); + navigate("/"); + } catch (error) { + console.error("Error fetching user settings:", error); + localStorage.removeItem(API_CONFIG.SESSION_DATA.SETTINGS); + localStorage.removeItem(API_CONFIG.SESSION_DATA.COOKIE); + removeCookie('session', { path: '/' }); + setErrors((prev) => ({ + ...prev, + auth: "Session expired. Please log in again.", + })); + } + } + })(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + React.useEffect(() => { let eventMethod = window.addEventListener ? "addEventListener" : "attachEvent"; let eventer = window[eventMethod]; @@ -59,29 +90,46 @@ const Login = () => { sessionCookie.value, { path: '/', - // domain: API_CONFIG.BASE_URL.replace(/^https?:\/\//, '').replace(/:\d+$/, ''), secure: false, sameSite: false, httpOnly: false } ); } - const userData = await requestUserSettings(groupname); - localStorage.setItem(API_CONFIG.SESSION_DATA.SETTINGS, JSON.stringify(userData)); - localStorage.setItem(API_CONFIG.SESSION_DATA.COOKIE, JSON.stringify({ - name: 'session', - value: sessionCookie.value, - expires: expires - })); - setUserData({ - name: userData['groupname'], - id: userData['orcid'], - email: userData?.emails[0]?.email, - role: userData['own-role'], - groupname: userData['groupname'], - settings: userData - }); - navigate("/") + // Check if the session cookie is present + if (!sessionCookie) { + setErrors((prev) => ({ + ...prev, + auth: "Session cookie not found. Please try again", + })); + return; + } + // Retrieve user settings + try { + const userData = await requestUserSettings(groupname); + localStorage.setItem(API_CONFIG.SESSION_DATA.SETTINGS, JSON.stringify(userData)); + localStorage.setItem(API_CONFIG.SESSION_DATA.COOKIE, JSON.stringify({ + name: 'session', + value: sessionCookie.value, + expires: expires + })); + setUserData({ + name: userData['groupname'], + id: userData['orcid'], + email: userData?.emails[0]?.email, + role: userData['own-role'], + groupname: userData['groupname'], + settings: userData + }); + navigate("/") + } catch (error) { + console.error("Error fetching user settings:", error); + removeCookie('session', { path: '/' }); + setErrors((prev) => ({ + ...prev, + auth: "Failed to fetch user settings. Please try again", + })); + } } else if (code === 401) { setErrors((prev) => ({ ...prev, @@ -94,9 +142,7 @@ const Login = () => { })); } }); - setIsLoading(false) - // eslint-disable-next-line react-hooks/exhaustive-deps }, [isLoading]); diff --git a/src/components/Header/index.jsx b/src/components/Header/index.jsx index 9ee96464..d5a13c24 100644 --- a/src/components/Header/index.jsx +++ b/src/components/Header/index.jsx @@ -35,6 +35,7 @@ import EditBulkTermsDialog from "../Dashboard/EditBulkTerms/EditBulkTermsDialog" import ModeEditOutlineOutlinedIcon from "@mui/icons-material/ModeEditOutlineOutlined"; import PersonOutlineIcon from '@mui/icons-material/PersonOutline'; import { userLogout } from "../../api/endpoints/apiService"; +import { useCookies } from 'react-cookie'; import { vars } from "../../theme/variables"; const { gray200, white, gray100, gray600 } = vars; @@ -159,6 +160,8 @@ const Header = () => { const [isLoggedIn, setIsLoggedIn] = React.useState(false); const { user, setUserData } = useContext(GlobalDataContext); const [openNewTermDialog, setOpenNewTermDialog] = React.useState(false); + // eslint-disable-next-line no-unused-vars + const [existingCookies, setCookie, removeCookie] = useCookies(['session']); const handleNewTermDialogClose = () => { setOpenNewTermDialog(false); @@ -219,9 +222,16 @@ const Header = () => { setOpenList(!openList); }; - const handleMenuClick = (e, menu) => { + const handleMenuClick = async (e, menu) => { if (menu.label === 'Log out') { - userLogout(user['groupname']); + try { + await userLogout(user['groupname']); + } catch (error) { + console.error("Logout error:", error); + } finally { + setUserData(null); + } + removeCookie('session', { path: '/' }); localStorage.removeItem('session'); localStorage.removeItem('settings'); setUserData({});