From eb89a324abbdf69091e5c78530ec62f2c2ccbcd1 Mon Sep 17 00:00:00 2001 From: Luc SORIGNET Date: Fri, 21 Feb 2025 19:22:33 +0100 Subject: [PATCH] refactor: Deplacement du JWT dans le back --- Front-End/package-lock.json | 1 - Front-End/src/app/500.js | 15 ++++ Front-End/src/app/[locale]/admin/layout.js | 4 +- Front-End/src/app/[locale]/admin/page.js | 2 +- .../src/app/[locale]/admin/structure/page.js | 26 +++--- .../subscriptions/editInscription/page.js | 2 +- .../app/[locale]/admin/subscriptions/page.js | 8 +- .../[locale]/parents/editInscription/page.js | 2 +- Front-End/src/app/[locale]/parents/layout.js | 4 +- Front-End/src/app/[locale]/parents/page.js | 2 +- .../src/app/[locale]/users/login/error.js | 7 ++ .../src/app/[locale]/users/login/page.js | 49 +--------- .../app/[locale]/users/password/new/page.js | 2 +- .../app/[locale]/users/password/reset/page.js | 2 +- .../src/app/[locale]/users/subscribe/page.js | 2 +- .../src/app/{lib => actions}/authAction.js | 68 +++++++------- .../app/{lib => actions}/messagerieAction.js | 0 .../registerFileGroupAction.js | 0 .../src/app/{lib => actions}/schoolAction.js | 0 .../{lib => actions}/subscriptionAction.js | 0 Front-End/src/components/FileUpload.js | 2 +- .../Inscription/InscriptionFormShared.js | 4 +- .../components/RegistrationFileGroupList.js | 2 +- .../Configuration/TeachersSection.js | 2 +- .../Structure/Files/FilesManagement.js | 4 +- Front-End/src/pages/api/auth/[...nextauth].js | 90 ++++++++++--------- Front-End/src/utils/Url.js | 1 + 27 files changed, 145 insertions(+), 156 deletions(-) create mode 100644 Front-End/src/app/500.js create mode 100644 Front-End/src/app/[locale]/users/login/error.js rename Front-End/src/app/{lib => actions}/authAction.js (82%) rename Front-End/src/app/{lib => actions}/messagerieAction.js (100%) rename Front-End/src/app/{lib => actions}/registerFileGroupAction.js (100%) rename Front-End/src/app/{lib => actions}/schoolAction.js (100%) rename Front-End/src/app/{lib => actions}/subscriptionAction.js (100%) diff --git a/Front-End/package-lock.json b/Front-End/package-lock.json index 8609a5a..4a9262e 100644 --- a/Front-End/package-lock.json +++ b/Front-End/package-lock.json @@ -3807,7 +3807,6 @@ "version": "9.0.2", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", "dependencies": { "jws": "^3.2.2", "lodash.includes": "^4.3.0", diff --git a/Front-End/src/app/500.js b/Front-End/src/app/500.js new file mode 100644 index 0000000..e2a6f48 --- /dev/null +++ b/Front-End/src/app/500.js @@ -0,0 +1,15 @@ +import Link from 'next/link' +import Logo from '../components/Logo' + +export default function Custom500() { + return ( +
+
+ +

500 | Erreur interne

+

Une erreur interne est survenue.

+ Retour Accueil +
+
+ ) +} \ No newline at end of file diff --git a/Front-End/src/app/[locale]/admin/layout.js b/Front-End/src/app/[locale]/admin/layout.js index 3798cf0..6f875ed 100644 --- a/Front-End/src/app/[locale]/admin/layout.js +++ b/Front-End/src/app/[locale]/admin/layout.js @@ -25,8 +25,8 @@ import { FE_ADMIN_SETTINGS_URL } from '@/utils/Url'; -import { disconnect } from '@/app/lib/authAction'; -import { fetchEstablishment } from '@/app/lib/schoolAction'; +import { disconnect } from '@/app/actions/authAction'; +import { fetchEstablishment } from '@/app/actions/schoolAction'; import ProtectedRoute from '@/components/ProtectedRoute'; import { SessionProvider } from 'next-auth/react'; diff --git a/Front-End/src/app/[locale]/admin/page.js b/Front-End/src/app/[locale]/admin/page.js index 4268ad7..3924f07 100644 --- a/Front-End/src/app/[locale]/admin/page.js +++ b/Front-End/src/app/[locale]/admin/page.js @@ -5,7 +5,7 @@ import { useTranslations } from 'next-intl'; import { Users, Clock, CalendarCheck, School, TrendingUp, UserCheck } from 'lucide-react'; import Loader from '@/components/Loader'; import ClasseDetails from '@/components/ClasseDetails'; -import { fetchClasses } from '@/app/lib/schoolAction'; +import { fetchClasses } from '@/app/actions/schoolAction'; // Composant StatCard pour afficher une statistique const StatCard = ({ title, value, icon, change, color = "blue" }) => ( diff --git a/Front-End/src/app/[locale]/admin/structure/page.js b/Front-End/src/app/[locale]/admin/structure/page.js index b8de3f8..c656f65 100644 --- a/Front-End/src/app/[locale]/admin/structure/page.js +++ b/Front-End/src/app/[locale]/admin/structure/page.js @@ -9,22 +9,22 @@ import { ClassesProvider } from '@/context/ClassesContext'; import { createDatas, updateDatas, removeDatas, - fetchSpecialities, - fetchTeachers, - fetchClasses, - fetchSchedules, - fetchRegistrationDiscounts, - fetchTuitionDiscounts, - fetchRegistrationFees, + fetchSpecialities, + fetchTeachers, + fetchClasses, + fetchSchedules, + fetchRegistrationDiscounts, + fetchTuitionDiscounts, + fetchRegistrationFees, fetchTuitionFees, fetchRegistrationPaymentPlans, fetchTuitionPaymentPlans, fetchRegistrationPaymentModes, - fetchTuitionPaymentModes } from '@/app/lib/schoolAction'; + fetchTuitionPaymentModes } from '@/app/actions/schoolAction'; import SidebarTabs from '@/components/SidebarTabs'; import FilesManagement from '@/components/Structure/Files/FilesManagement'; -import { fetchRegisterFormFileTemplate } from '@/app/lib/subscriptionAction'; +import { fetchRegisterFormFileTemplate } from '@/app/actions/subscriptionAction'; @@ -156,7 +156,7 @@ export default function Page() { const handleRegistrationPaymentPlans = () => { fetchRegistrationPaymentPlans() - .then(data => { + .then(data => { setRegistrationPaymentPlans(data); }) .catch(error => console.error('Error fetching registration payment plans:', error)); @@ -164,7 +164,7 @@ export default function Page() { const handleTuitionPaymentPlans = () => { fetchTuitionPaymentPlans() - .then(data => { + .then(data => { setTuitionPaymentPlans(data); }) .catch(error => console.error('Error fetching tuition payment plans:', error)); @@ -172,7 +172,7 @@ export default function Page() { const handleRegistrationPaymentModes = () => { fetchRegistrationPaymentModes() - .then(data => { + .then(data => { setRegistrationPaymentModes(data); }) .catch(error => console.error('Error fetching registration payment modes:', error)); @@ -180,7 +180,7 @@ export default function Page() { const handleTuitionPaymentModes = () => { fetchTuitionPaymentModes() - .then(data => { + .then(data => { setTuitionPaymentModes(data); }) .catch(error => console.error('Error fetching tuition payment modes:', error)); diff --git a/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js b/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js index 2b95eb9..c262b05 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/editInscription/page.js @@ -5,7 +5,7 @@ import InscriptionFormShared from '@/components/Inscription/InscriptionFormShare import { FE_ADMIN_SUBSCRIPTIONS_URL } from '@/utils/Url'; import { useCsrfToken } from '@/context/CsrfContext'; import { mockStudent } from '@/data/mockStudent'; -import { editRegisterForm, fetchRegisterForm } from '@/app/lib/subscriptionAction'; +import { editRegisterForm, fetchRegisterForm } from '@/app/actions/subscriptionAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; diff --git a/Front-End/src/app/[locale]/admin/subscriptions/page.js b/Front-End/src/app/[locale]/admin/subscriptions/page.js index d5cc9db..7db98bc 100644 --- a/Front-End/src/app/[locale]/admin/subscriptions/page.js +++ b/Front-End/src/app/[locale]/admin/subscriptions/page.js @@ -26,16 +26,16 @@ import { archiveRegisterForm, fetchRegisterFormFileTemplate, fetchStudents, - editRegisterForm } from "@/app/lib/subscriptionAction" + editRegisterForm } from "@/app/actions/subscriptionAction" import { fetchClasses, fetchRegistrationDiscounts, fetchTuitionDiscounts, fetchRegistrationFees, - fetchTuitionFees } from '@/app/lib/schoolAction'; + fetchTuitionFees } from '@/app/actions/schoolAction'; -import { createProfile } from '@/app/lib/authAction'; +import { createProfile } from '@/app/actions/authAction'; import { BASE_URL, @@ -43,7 +43,7 @@ import { import DjangoCSRFToken from '@/components/DjangoCSRFToken' import { useCsrfToken } from '@/context/CsrfContext'; -import { fetchRegistrationFileGroups } from '@/app/lib/registerFileGroupAction'; +import { fetchRegistrationFileGroups } from '@/app/actions/registerFileGroupAction'; import { ESTABLISHMENT_ID } from '@/utils/Url'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; diff --git a/Front-End/src/app/[locale]/parents/editInscription/page.js b/Front-End/src/app/[locale]/parents/editInscription/page.js index 1de9938..d2fb37a 100644 --- a/Front-End/src/app/[locale]/parents/editInscription/page.js +++ b/Front-End/src/app/[locale]/parents/editInscription/page.js @@ -4,7 +4,7 @@ import InscriptionFormShared from '@/components/Inscription/InscriptionFormShare import { useSearchParams, useRouter } from 'next/navigation'; import { useCsrfToken } from '@/context/CsrfContext'; import { FE_PARENTS_HOME_URL} from '@/utils/Url'; -import { editRegisterForm} from '@/app/lib/subscriptionAction'; +import { editRegisterForm} from '@/app/actions/subscriptionAction'; export default function Page() { const searchParams = useSearchParams(); diff --git a/Front-End/src/app/[locale]/parents/layout.js b/Front-End/src/app/[locale]/parents/layout.js index 41cb7d0..cb84b03 100644 --- a/Front-End/src/app/[locale]/parents/layout.js +++ b/Front-End/src/app/[locale]/parents/layout.js @@ -7,10 +7,10 @@ import { User, MessageSquare, LogOut, Settings, Home } from 'lucide-react'; // A import Logo from '@/components/Logo'; // Ajout de l'importation du composant Logo import { FE_PARENTS_HOME_URL,FE_PARENTS_MESSAGERIE_URL,FE_PARENTS_SETTINGS_URL } from '@/utils/Url'; // Ajout de l'importation de l'URL de la page d'accueil parent import useLocalStorage from '@/hooks/useLocalStorage'; -import { fetchMessages } from '@/app/lib/messagerieAction'; +import { fetchMessages } from '@/app/actions/messagerieAction'; import ProtectedRoute from '@/components/ProtectedRoute'; import { SessionProvider } from 'next-auth/react'; -import { disconnect } from '@/app/lib/authAction'; +import { disconnect } from '@/app/actions/authAction'; import Popup from '@/components/Popup'; export default function Layout({ diff --git a/Front-End/src/app/[locale]/parents/page.js b/Front-End/src/app/[locale]/parents/page.js index 695ed33..239f214 100644 --- a/Front-End/src/app/[locale]/parents/page.js +++ b/Front-End/src/app/[locale]/parents/page.js @@ -6,7 +6,7 @@ import { Edit } from 'lucide-react'; import StatusLabel from '@/components/StatusLabel'; import useLocalStorage from '@/hooks/useLocalStorage'; import { FE_PARENTS_EDIT_INSCRIPTION_URL } from '@/utils/Url'; -import { fetchChildren } from '@/app/lib/subscriptionAction'; +import { fetchChildren } from '@/app/actions/subscriptionAction'; export default function ParentHomePage() { const [actions, setActions] = useState([]); diff --git a/Front-End/src/app/[locale]/users/login/error.js b/Front-End/src/app/[locale]/users/login/error.js new file mode 100644 index 0000000..5f75634 --- /dev/null +++ b/Front-End/src/app/[locale]/users/login/error.js @@ -0,0 +1,7 @@ +"use client"; + +function ErrorBoundary({ + error +}) { + return <>{error.message}; +} \ No newline at end of file diff --git a/Front-End/src/app/[locale]/users/login/page.js b/Front-End/src/app/[locale]/users/login/page.js index e2c37b0..f44810d 100644 --- a/Front-End/src/app/[locale]/users/login/page.js +++ b/Front-End/src/app/[locale]/users/login/page.js @@ -13,6 +13,7 @@ import { FE_ADMIN_SUBSCRIPTIONS_URL, FE_PARENTS_HOME_URL } from '@/utils/Url'; +import { login } from '@/app/actions/authAction'; import useLocalStorage from '@/hooks/useLocalStorage'; import { signIn, getSession } from 'next-auth/react'; import { useCsrfToken } from '@/context/CsrfContext'; // Importez le hook useCsrfToken @@ -36,59 +37,15 @@ export default function Page() { return data.errorMessage === "" } - /*async function handleFormLogin(formData) { - setIsLoading(true); - - try { - const result = await signIn('credentials', { - redirect: false, - email: formData.get('login'), - password: formData.get('password'), - }); - - console.log('Sign In Result', result); - setIsLoading(false); - - if (result.error) { - setErrorMessage(result.error); - } else { - const session = await getSession(); - if (!session || !session.user) { - throw new Error('Session not found'); - } - const user = session.user; - console.log('User Session:', user); - localStorage.setItem('userId', user.id); // Stocker l'identifiant de l'utilisateur - if (user.droit === 0) { - // Vue ECOLE - } else if (user.droit === 1) { - // Vue ADMIN - router.push(FE_ADMIN_SUBSCRIPTIONS_URL); - } else if (user.droit === 2) { - // Vue PARENT - router.push(FE_PARENTS_HOME_URL); - } else { - // Cas anormal - } - } - } catch (error) { - console.error('Error during sign in:', error); - setIsLoading(false); - setErrorMessage('An error occurred during sign in.'); - } - }*/ - function handleFormLogin(formData) { setIsLoading(true); - - signIn('credentials', { - redirect: false, + + login({ email: formData.get('login'), password: formData.get('password'), }).then(result => { console.log('Sign In Result', result); setIsLoading(false); - if (result.error) { setErrorMessage(result.error); } else { diff --git a/Front-End/src/app/[locale]/users/password/new/page.js b/Front-End/src/app/[locale]/users/password/new/page.js index 900e76d..9f2b976 100644 --- a/Front-End/src/app/[locale]/users/password/new/page.js +++ b/Front-End/src/app/[locale]/users/password/new/page.js @@ -11,7 +11,7 @@ import Popup from '@/components/Popup'; // Importez le composant Popup import { User } from 'lucide-react'; // Importez directement les icônes nécessaires import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import { useCsrfToken } from '@/context/CsrfContext'; -import { sendNewPassword } from '@/app/lib/authAction'; +import { sendNewPassword } from '@/app/actions/authAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; diff --git a/Front-End/src/app/[locale]/users/password/reset/page.js b/Front-End/src/app/[locale]/users/password/reset/page.js index 427ad57..fdb2655 100644 --- a/Front-End/src/app/[locale]/users/password/reset/page.js +++ b/Front-End/src/app/[locale]/users/password/reset/page.js @@ -12,7 +12,7 @@ import Popup from '@/components/Popup'; import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import { KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires import { useCsrfToken } from '@/context/CsrfContext'; -import { getResetPassword, resetPassword } from '@/app/lib/authAction'; +import { getResetPassword, resetPassword } from '@/app/actions/authAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; diff --git a/Front-End/src/app/[locale]/users/subscribe/page.js b/Front-End/src/app/[locale]/users/subscribe/page.js index 768bfbc..d59f3e1 100644 --- a/Front-End/src/app/[locale]/users/subscribe/page.js +++ b/Front-End/src/app/[locale]/users/subscribe/page.js @@ -12,7 +12,7 @@ import Popup from '@/components/Popup'; // Importez le composant Popup import { User, KeySquare } from 'lucide-react'; // Importez directement les icônes nécessaires import { FE_USERS_LOGIN_URL } from '@/utils/Url'; import { useCsrfToken } from '@/context/CsrfContext'; -import { subscribe } from '@/app/lib/authAction'; +import { subscribe } from '@/app/actions/authAction'; const useFakeData = process.env.NEXT_PUBLIC_USE_FAKE_DATA === 'true'; export default function Page() { diff --git a/Front-End/src/app/lib/authAction.js b/Front-End/src/app/actions/authAction.js similarity index 82% rename from Front-End/src/app/lib/authAction.js rename to Front-End/src/app/actions/authAction.js index 14701d8..df79cbd 100644 --- a/Front-End/src/app/lib/authAction.js +++ b/Front-End/src/app/actions/authAction.js @@ -1,6 +1,7 @@ -import { signOut } from 'next-auth/react'; +import { signOut, signIn, getSession } from 'next-auth/react'; import { BE_AUTH_LOGIN_URL, + BE_AUTH_REFRESH_JWT_URL, BE_AUTH_REGISTER_URL, BE_AUTH_PROFILES_URL, BE_AUTH_RESET_PASSWORD_URL, @@ -18,40 +19,47 @@ const requestResponseHandler = async (response) => { throw error; }; -/*export const login = (data, csrfToken) => { - const request = new Request( - `${BE_AUTH_LOGIN_URL}`, - { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - 'X-CSRFToken': csrfToken - }, - body: JSON.stringify(data), - credentials: 'include', - } - ); - return fetch(request).then(requestResponseHandler); -};*/ - -export const login = (data, csrfToken) => { - const request = new Promise((resolve, reject) => { - signIn('credentials', { +/** + * Login action + */ +export const login = (data) => { + return signIn('credentials', { redirect: false, email: data.email, password: data.password, - }).then(result => { - if (result.error) { - reject(new Error(result.error)); - } else { - resolve(result); - } - }).catch(reject); - }); - - return request.then(requestResponseHandler); + }) }; +/** + * Login user with API + */ +export const getJWT = (data) =>{ + const request = new Request( + `${BE_AUTH_LOGIN_URL}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + credentials: 'include' + } + ); + return fetch(request).then(requestResponseHandler) +} +export const refreshJWT = (data) =>{ + const request = new Request( + `${BE_AUTH_REFRESH_JWT_URL}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(data), + credentials: 'include' + } + ); + return fetch(request).then(requestResponseHandler) +} + /** * Disconnects the user after confirming the action. * If `NEXT_PUBLIC_USE_FAKE_DATA` environment variable is set to 'true', it will log a fake disconnect and redirect to the login URL. diff --git a/Front-End/src/app/lib/messagerieAction.js b/Front-End/src/app/actions/messagerieAction.js similarity index 100% rename from Front-End/src/app/lib/messagerieAction.js rename to Front-End/src/app/actions/messagerieAction.js diff --git a/Front-End/src/app/lib/registerFileGroupAction.js b/Front-End/src/app/actions/registerFileGroupAction.js similarity index 100% rename from Front-End/src/app/lib/registerFileGroupAction.js rename to Front-End/src/app/actions/registerFileGroupAction.js diff --git a/Front-End/src/app/lib/schoolAction.js b/Front-End/src/app/actions/schoolAction.js similarity index 100% rename from Front-End/src/app/lib/schoolAction.js rename to Front-End/src/app/actions/schoolAction.js diff --git a/Front-End/src/app/lib/subscriptionAction.js b/Front-End/src/app/actions/subscriptionAction.js similarity index 100% rename from Front-End/src/app/lib/subscriptionAction.js rename to Front-End/src/app/actions/subscriptionAction.js diff --git a/Front-End/src/components/FileUpload.js b/Front-End/src/components/FileUpload.js index a349e83..e13ba15 100644 --- a/Front-End/src/components/FileUpload.js +++ b/Front-End/src/components/FileUpload.js @@ -1,7 +1,7 @@ import React, { useState, useEffect } from 'react'; import ToggleSwitch from '@/components/ToggleSwitch'; // Import du composant ToggleSwitch import DraggableFileUpload from './DraggableFileUpload'; -import { fetchRegistrationFileGroups } from '@/app/lib/registerFileGroupAction'; +import { fetchRegistrationFileGroups } from '@/app/actions/registerFileGroupAction'; export default function FileUpload({ onFileUpload, fileToEdit = null }) { const [fileName, setFileName] = useState(''); diff --git a/Front-End/src/components/Inscription/InscriptionFormShared.js b/Front-End/src/components/Inscription/InscriptionFormShared.js index 1f458fd..18fd6bd 100644 --- a/Front-End/src/components/Inscription/InscriptionFormShared.js +++ b/Front-End/src/components/Inscription/InscriptionFormShared.js @@ -7,8 +7,8 @@ import Loader from '@/components/Loader'; import Button from '@/components/Button'; import DjangoCSRFToken from '@/components/DjangoCSRFToken'; import Table from '@/components/Table'; -import { fetchRegisterFormFileTemplate, createRegistrationFormFile, fetchRegisterForm, deleteRegisterFormFile } from '@/app/lib/subscriptionAction'; -import { fetchRegistrationFileFromGroup } from '@/app/lib/registerFileGroupAction'; +import { fetchRegisterFormFileTemplate, createRegistrationFormFile, fetchRegisterForm, deleteRegisterFormFile } from '@/app/actions/subscriptionAction'; +import { fetchRegistrationFileFromGroup } from '@/app/actions/registerFileGroupAction'; import { Download, Upload, Trash2, Eye } from 'lucide-react'; import { BASE_URL } from '@/utils/Url'; import DraggableFileUpload from '@/components/DraggableFileUpload'; diff --git a/Front-End/src/components/RegistrationFileGroupList.js b/Front-End/src/components/RegistrationFileGroupList.js index c5e9e4f..9a756e2 100644 --- a/Front-End/src/components/RegistrationFileGroupList.js +++ b/Front-End/src/components/RegistrationFileGroupList.js @@ -1,5 +1,5 @@ import React, { useEffect, useState } from 'react'; -import { fetchRegistrationFileGroups } from '@/app/lib/registerFileGroupAction'; +import { fetchRegistrationFileGroups } from '@/app/actions/registerFileGroupAction'; export default function RegistrationFileGroupList() { const [groups, setGroups] = useState([]); diff --git a/Front-End/src/components/Structure/Configuration/TeachersSection.js b/Front-End/src/components/Structure/Configuration/TeachersSection.js index f421b3d..d95bf78 100644 --- a/Front-End/src/components/Structure/Configuration/TeachersSection.js +++ b/Front-End/src/components/Structure/Configuration/TeachersSection.js @@ -3,7 +3,7 @@ import { Plus, Edit3, Trash2, GraduationCap, Check, X, Hand } from 'lucide-react import Table from '@/components/Table'; import Popup from '@/components/Popup'; import ToggleSwitch from '@/components/ToggleSwitch'; -import { createProfile, updateProfile } from '@/app/lib/authAction'; +import { createProfile, updateProfile } from '@/app/actions/authAction'; import { useCsrfToken } from '@/context/CsrfContext'; import { DndProvider, useDrag, useDrop } from 'react-dnd'; import { HTML5Backend } from 'react-dnd-html5-backend'; diff --git a/Front-End/src/components/Structure/Files/FilesManagement.js b/Front-End/src/components/Structure/Files/FilesManagement.js index 0eb9928..be2881f 100644 --- a/Front-End/src/components/Structure/Files/FilesManagement.js +++ b/Front-End/src/components/Structure/Files/FilesManagement.js @@ -11,13 +11,13 @@ import { editRegistrationFormFileTemplate, deleteRegisterFormFileTemplate, getRegisterFormFileTemplate -} from '@/app/lib/subscriptionAction'; +} from '@/app/actions/subscriptionAction'; import { fetchRegistrationFileGroups, createRegistrationFileGroup, deleteRegistrationFileGroup, editRegistrationFileGroup -} from '@/app/lib/registerFileGroupAction'; +} from '@/app/actions/registerFileGroupAction'; import RegistrationFileGroupForm from '@/components/RegistrationFileGroupForm'; export default function FilesManagement({ csrfToken }) { diff --git a/Front-End/src/pages/api/auth/[...nextauth].js b/Front-End/src/pages/api/auth/[...nextauth].js index c0391eb..a22ef80 100644 --- a/Front-End/src/pages/api/auth/[...nextauth].js +++ b/Front-End/src/pages/api/auth/[...nextauth].js @@ -1,6 +1,8 @@ import NextAuth from 'next-auth'; import CredentialsProvider from 'next-auth/providers/credentials'; -import { BE_AUTH_LOGIN_URL } from '@/utils/Url'; +import { getJWT, refreshJWT } from '@/app/actions/authAction'; + +import jwt_decode from 'jsonwebtoken'; // Changed import const options = { providers: [ @@ -11,63 +13,66 @@ const options = { password: { label: 'Password', type: 'password' } }, authorize: async (credentials, req) => { - const response = await fetch(`${BE_AUTH_LOGIN_URL}`, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify({ + try { + const data = { email: credentials.email, password: credentials.password - }), - credentials: 'include' - }); - - const user = await response.json(); - - console.log("API response:", user); - if (response.ok && user) { - const userData = { - id: user.id, - role: user.profil, - droit: user.droit }; - return userData; - } else { - throw new Error(user.errorMessage || 'Invalid credentials'); + + const user = await getJWT(data); + + if (user) { + console.log("API response:", user); + return user; + } + + throw new Error('Invalid credentials'); + } catch (error) { + throw new Error(error.message || 'Invalid credentials'); } } }) ], session: { - jwt: true, - maxAge: 24 * 60 * 60, // 1 day in seconds - updateAge: 24 * 60 * 60 // Update session every day - }, - jwt: { - maxAge: 24 * 60 * 60 // 1 day in seconds + strategy:"jwt", }, callbacks: { async jwt({ token, user }) { - console.log("JWT callback called", user); - if (user) { - token.id = user.id; - token.role = user.role; - token.droit = user.droit; + if (user) { + token.token = user.token; + token.refresh = user.refresh; + token.tokenExpires = jwt_decode.decode(user.token).exp * 1000; + } + // Vérifie si l'access token a expiré + if (Date.now() < token.tokenExpires) { + return token; + } + // Renouvelle le token expiré + try { + const data = {refresh: token.refresh} + const res = await refreshJWT(data); + console.log(res); + token.token = res.token; + token.refresh = res.refresh; + token.tokenExpires = jwt_decode.decode(res.token).exp * 1000; + console.log("Token refreshed", token); + return token; + } catch (error) { + console.error("Erreur lors du rafraîchissement du token", error); + return token; } - return token; }, async session({ session, token }) { console.log("Session callback called", token); if (!token) { throw new Error('Token not found'); } - session.user = { - id: token.id, - role: token.role, - droit: token.droit - }; - return session; + else{ + const decodedToken = jwt_decode.decode(token.token); + const {user_id,email,droit} = decodedToken; + session.user = {id:user_id,email,droit}; + return session; + } } }, pages: { @@ -76,7 +81,4 @@ const options = { csrf: true }; -export default (req, res) => { - console.log("NextAuth handler called"); - return NextAuth(req, res, options); -}; \ No newline at end of file +export default (req, res) => NextAuth(req, res, options); \ No newline at end of file diff --git a/Front-End/src/utils/Url.js b/Front-End/src/utils/Url.js index 3db9814..65636d3 100644 --- a/Front-End/src/utils/Url.js +++ b/Front-End/src/utils/Url.js @@ -10,6 +10,7 @@ export const BE_AUTH_NEW_PASSWORD_URL = `${BASE_URL}/Auth/newPassword` export const BE_AUTH_REGISTER_URL = `${BASE_URL}/Auth/subscribe` export const BE_AUTH_RESET_PASSWORD_URL = `${BASE_URL}/Auth/resetPassword` export const BE_AUTH_LOGIN_URL = `${BASE_URL}/Auth/login` +export const BE_AUTH_REFRESH_JWT_URL = `${BASE_URL}/Auth/refreshJWT` export const BE_AUTH_LOGOUT_URL = `${BASE_URL}/Auth/logout` export const BE_AUTH_PROFILES_URL = `${BASE_URL}/Auth/profiles` export const BE_AUTH_CSRF_URL = `${BASE_URL}/Auth/csrf`