Files
n3wt-school/Front-End/src/pages/api/auth/[...nextauth].js
2025-03-09 16:22:28 +01:00

109 lines
2.8 KiB
JavaScript

import NextAuth from 'next-auth';
import CredentialsProvider from 'next-auth/providers/credentials';
import { getJWT, refreshJWT } from '@/app/actions/authAction';
import jwt_decode from 'jsonwebtoken';
import logger from '@/utils/logger';
const options = {
secret: process.env.AUTH_SECRET,
providers: [
CredentialsProvider({
name: 'Credentials',
credentials: {
email: { label: 'Email', type: 'email' },
password: { label: 'Password', type: 'password' },
role_type: { label: 'Role Type', type: 'text' }
},
authorize: async (credentials, req) => {
try {
const data = {
email: credentials.email,
password: credentials.password,
role_type: credentials.role_type
};
const user = await getJWT(data);
if (user) {
return user;
}
} catch (error) {
throw new Error(error.message || 'Invalid credentials');
}
}
})
],
session: {
strategy: "jwt",
maxAge: 30 * 24 * 60 * 60, // 30 jours
updateAge: 24 * 60 * 60, // 24 heures
},
cookies: {
sessionToken: {
name: 'n3wtschool_session_token',
options: {
httpOnly: true,
sameSite: 'lax',
path: '/',
secure: process.env.NODE_ENV === 'production'
}
}
},
callbacks: {
async jwt({ token, user }) {
// Si c'est la première connexion
if (user && user?.token) {
return {
...token,
token: user.token,
refresh: user.refresh,
tokenExpires: jwt_decode.decode(user.token).exp * 1000
};
}
// Vérifier si le token n'est pas expiré
if (Date.now() < token.tokenExpires) {
return token;
}
// Token expiré, essayer de le rafraîchir
try {
const response = await refreshJWT({ refresh: token.refresh });
if (response && response?.token) {
return {
...token,
token: response.token,
refresh: response.refresh,
tokenExpires: jwt_decode.decode(response.token).exp * 1000
};
}
else{
throw new Error('Failed to refresh token');
}
} catch (error) {
logger.error("Refresh token failed:", error);
return token;
}
},
async session({ session, token }) {
if (token && token?.token) {
const { user_id, email, roles } = jwt_decode.decode(token.token);
session.user = {
...session.user,
token: token.token,
refresh: token.refresh,
user_id: user_id,
email: email,
roles: roles
};
}
return session;
}
},
pages: {
signIn: '/[locale]/users/login'
},
csrf: true
};
export default (req, res) => NextAuth(req, res, options);