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`