From ca4ab194693bdba9d16587f58118cc476fcd19c5 Mon Sep 17 00:00:00 2001 From: a2-imeri <Alfret2.imeri@live.uwe.ac.uk> Date: Tue, 2 Jul 2024 21:01:35 +0100 Subject: [PATCH] Update Token Sessions --- .../__pycache__/settings.cpython-310.pyc | Bin 3897 -> 4147 bytes MisplaceAI/MisplaceAI/settings.py | 17 ++++ frontend/src/services/api.js | 25 +++--- frontend/src/services/auth.js | 79 +++++++++++------- 4 files changed, 82 insertions(+), 39 deletions(-) diff --git a/MisplaceAI/MisplaceAI/__pycache__/settings.cpython-310.pyc b/MisplaceAI/MisplaceAI/__pycache__/settings.cpython-310.pyc index 7c952482daa59997e044c9f5af09e212b1a6f4eb..78bd7a0ef7bd7019670610a6016177d89c9a0e2d 100644 GIT binary patch delta 603 zcmdlfw^@NNpO=@5fq{XcAi5=OhWJE28OCK3wJYj5qQp`-qQq19q9juIqa;&!qoh)J zqoh+fqGVD8qGVG9(-~4YQiReOQiK;VW-_LT%wb7qjFL+cjgn7iND*7am?ECem?ANU zDM}%gHAON-s+Td9HAOl_rk62=BZVVHb`DFFVv1afe2PMfVv16Va*9fd>KwLA#weu} zwG{RGOvV(A6wMT^OvV)LIZP>PDLR>qDQYRYnT+WyQOYTLQ7S3=QK~5%QEDk1QR*oM zQ5vb7DTdMvshlZB(hTWLQJN{nQCg||MHf>TQ<!tKqqM6OQ?(c9q?jyZT%fy<A;naZ zA%#(rA;nCRAxbY*Z-IV_`9j7N3rU6r`YDzRO&LLwQ3k033k*{Y7BVt2gfpZt2Q#oR zq-tjwWf@mqU}ONnNU&%*nAEh|yo<4yl|7T8REVKUdGZBjaUQ*-#N_PMyp&?Sl%&n> z>@2K|CX;=5KG#QyIr|3%$2<D?_=m?k2f4bq`h|Ep`UKw+aSjf0i+A?-_x5y+_Xr6I z@b~kHyu}mb?;jE$8sy{b@8@<)DA+YP*wfz+rp(dZ^_DzL%rzpwGsrdGF(lq8$Ui*T zH7MTM$3NKhmMBaC$ZS(j*Z5#p=g=V6TT(FbV8<}mc-Ju3pvd?j*T7KM;E-E<FgaI0 wcTYdp&Az<yjBL&f3=BoilZ*KD85d1n#HTL6!pOqN!o<Q1flREEPxIvg00J$bRsaA1 delta 369 zcmdn2uv3mNpO=@5fq{X6)3hZmM|2{e3}e?s?TUK7D6tg&bcPg;6oGVx6v0J|nT#ny zb6C<Dqr_8$qa@N9QbZOprii99rijg9ijquaO%YF#=w(c0O_5BI>SavfNa0A4p2HF) zl_HZOn<AGYpQ4bWn4*-TJclilF-kf`B}FxpF-0v!Jw+pvF-3C@Q;JH8RwiSLN{V(S zV>(NHluU|Flx&J_lw1l&lza+DltPMLlwvApioP^MDrbs;G($R5lv0XelyWM6(cu)v z6y_Y2D3vP3RFws)DMkw!7pN^{NHLaVNMV#@NHLLQh*D2gU!aj<x{xu&Op;-NMvD1D zMvz>TW~#sftyIm0jEoH73@OaP3@i+(Dp``+Svr-67#Tn?5-eN}CN(WKUt{cL-Q3I0 z!pf*Sc@ocOzFRy&{{A8Hp+P>*{(f$oE&1db*=!jY7>aBs$MNekPMO@tug=88GWjTf F9soRKTSEW< diff --git a/MisplaceAI/MisplaceAI/settings.py b/MisplaceAI/MisplaceAI/settings.py index f163600..c913ecb 100644 --- a/MisplaceAI/MisplaceAI/settings.py +++ b/MisplaceAI/MisplaceAI/settings.py @@ -80,8 +80,25 @@ CSRF_TRUSTED_ORIGINS = [ # Note: CORS_ORIGIN_ALLOW_ALL is set to False for security reasons CORS_ORIGIN_ALLOW_ALL = False +CORS_ALLOW_CREDENTIALS = True +CSRF_COOKIE_HTTPONLY = True ROOT_URLCONF = 'MisplaceAI.urls' +SESSION_COOKIE_AGE = 1209600 # 2 weeks in seconds + +# Do not expire the session when the browser closes +SESSION_EXPIRE_AT_BROWSER_CLOSE = False + +# Optionally, secure the session cookie (recommended for production) +SESSION_COOKIE_SECURE = False # Set to True if using HTTPS + +# Save the session cookie on every request (optional, based on your needs) +SESSION_SAVE_EVERY_REQUEST = True + +# Configuration of the session engine +SESSION_ENGINE = 'django.contrib.sessions.backends.db' + + TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', diff --git a/frontend/src/services/api.js b/frontend/src/services/api.js index e81f19b..26c4cd0 100644 --- a/frontend/src/services/api.js +++ b/frontend/src/services/api.js @@ -1,6 +1,7 @@ // src/services/api.js + import axios from 'axios'; -import { refreshToken } from './auth'; +import { refreshToken, logout } from './auth'; export const getCsrfToken = () => { const cookies = document.cookie.split(';'); @@ -14,10 +15,11 @@ export const getCsrfToken = () => { }; const api = axios.create({ - baseURL: 'http://localhost:8080', // Ensure this URL is correct + baseURL: 'http://localhost:8080', headers: { 'Content-Type': 'application/json', }, + withCredentials: true, // Ensure credentials are sent with requests }); api.interceptors.request.use( @@ -34,16 +36,14 @@ api.interceptors.request.use( localStorage.setItem('token', newTokens.access); localStorage.setItem('tokenExpiry', newTokens.accessExpiry); } else { - localStorage.removeItem('token'); - localStorage.removeItem('refresh'); - localStorage.removeItem('tokenExpiry'); + console.log('Token refresh failed. Logging out...'); + logout(); window.location.href = '/login'; return Promise.reject('Session expired. Please log in again.'); } } catch (err) { - localStorage.removeItem('token'); - localStorage.removeItem('refresh'); - localStorage.removeItem('tokenExpiry'); + console.log('Error during token refresh:', err); + logout(); window.location.href = '/login'; return Promise.reject('Session expired. Please log in again.'); } @@ -56,17 +56,20 @@ api.interceptors.request.use( } return config; }, - (error) => Promise.reject(error) + (error) => { + console.log('Request error:', error); + return Promise.reject(error); + } ); api.interceptors.response.use( (response) => response, (error) => { - console.log('API error:', error); // Debugging + console.log('API error:', error); if (error.response && error.response.status === 500) { window.location.href = '/error-500'; } else if (error.request && !error.response) { - console.log('Network or server error'); // Debugging + console.log('Network or server error'); window.location.href = '/error-500'; } return Promise.reject(error); diff --git a/frontend/src/services/auth.js b/frontend/src/services/auth.js index 42da518..f0d90d0 100644 --- a/frontend/src/services/auth.js +++ b/frontend/src/services/auth.js @@ -2,27 +2,37 @@ import api from './api'; export const login = async (credentials) => { - const response = await api.post('/api/auth/login/', credentials); - if (response.data.access) { - localStorage.setItem('token', response.data.access); - localStorage.setItem('refresh', response.data.refresh); - const tokenPayload = JSON.parse(atob(response.data.access.split('.')[1])); - localStorage.setItem('tokenExpiry', tokenPayload.exp); - localStorage.setItem('isAuthenticated', true); + try { + const response = await api.post('/api/auth/login/', credentials); + if (response.data.access) { + localStorage.setItem('token', response.data.access); + localStorage.setItem('refresh', response.data.refresh); + const tokenPayload = JSON.parse(atob(response.data.access.split('.')[1])); + localStorage.setItem('tokenExpiry', tokenPayload.exp); + localStorage.setItem('isAuthenticated', true); + } + return response.data; + } catch (error) { + console.log('Login error:', error); + throw error; } - return response.data; }; export const register = async (userData) => { - const response = await api.post('/api/auth/register/', userData); - if (response.data.access) { - localStorage.setItem('token', response.data.access); - localStorage.setItem('refresh', response.data.refresh); - const tokenPayload = JSON.parse(atob(response.data.access.split('.')[1])); - localStorage.setItem('tokenExpiry', tokenPayload.exp); - localStorage.setItem('isAuthenticated', true); + try { + const response = await api.post('/api/auth/register/', userData); + if (response.data.access) { + localStorage.setItem('token', response.data.access); + localStorage.setItem('refresh', response.data.refresh); + const tokenPayload = JSON.parse(atob(response.data.access.split('.')[1])); + localStorage.setItem('tokenExpiry', tokenPayload.exp); + localStorage.setItem('isAuthenticated', true); + } + return response.data; + } catch (error) { + console.log('Registration error:', error); + throw error; } - return response.data; }; export const logout = () => { @@ -30,6 +40,9 @@ export const logout = () => { localStorage.removeItem('refresh'); localStorage.removeItem('tokenExpiry'); localStorage.removeItem('isAuthenticated'); + localStorage.removeItem('adminToken'); + localStorage.removeItem('isAdmin'); + localStorage.removeItem('username'); }; export const refreshToken = async () => { @@ -42,26 +55,36 @@ export const refreshToken = async () => { localStorage.setItem('tokenExpiry', tokenPayload.exp); return response.data; } catch (error) { + console.log('Token refresh error:', error); logout(); + return null; } } return null; }; export const getCurrentUser = async () => { - const response = await api.get('/api/auth/user/'); - return response.data; + try { + const response = await api.get('/api/auth/user/'); + return response.data; + } catch (error) { + console.log('Get current user error:', error); + throw error; + } }; - export const adminLogin = async (credentials) => { - const response = await api.post('/api/auth/admin/login/', credentials); - if (response.data.access) { - localStorage.setItem('adminToken', response.data.access); - localStorage.setItem('isAdmin', true); - localStorage.setItem('username', credentials.username); - localStorage.setItem('isAuthenticated', true); + try { + const response = await api.post('/api/auth/admin/login/', credentials); + if (response.data.access) { + localStorage.setItem('adminToken', response.data.access); + localStorage.setItem('isAdmin', true); + localStorage.setItem('username', credentials.username); + localStorage.setItem('isAuthenticated', true); + } + return response.data; + } catch (error) { + console.log('Admin login error:', error); + throw error; } - return response.data; -} - +}; -- GitLab