tokenRefresh, crear y editar productos con img funcionando

This commit is contained in:
2025-08-21 14:57:55 -04:00
parent 6a28e141a9
commit c45307d47d
22 changed files with 301 additions and 193 deletions

View File

@@ -100,65 +100,77 @@ const authConfig: NextAuthConfig = {
signIn: '/', //sigin page
},
callbacks: {
async jwt({
token,
user,
}: {
token: any;
user: User;
async jwt({ token, user }:{
user: User
token: any
}) {
// 1. Manejar el inicio de sesión inicial
// El `user` solo se proporciona en el primer inicio de sesión.
if (user) {
return {
id: user.id,
username: user.username,
fullname: user.fullname,
email: user.email,
role: user.role,
access_token: user.access_token,
access_expire_in: user.access_expire_in,
refresh_token: user.refresh_token,
refresh_expire_in: user.refresh_expire_in
}
// return token;
}
// 2. Si no es un nuevo login, verificar la expiración del token
const now = Math.floor(Date.now() / 1000); // Usar Math.floor para un número entero
// Verificar si el token de acceso aún es válido
if (now < (token.access_expire_in as number)) {
return token; // Si no ha expirado, no hacer nada y devolver el token actual
}
console.log("Now Access Expire:",token.access_expire_in);
// 3. Si el token de acceso ha expirado, verificar el refresh token
console.log("Access token ha expirado. Verificando refresh token...");
if (now > (token.refresh_expire_in as number)) {
console.log("Refresh token ha expirado. Forzando logout.");
return null; // Forzar el logout al devolver null
}
console.log("token:", token.refresh_token);
// 4. Si el token de acceso ha expirado pero el refresh token es válido, renovar
console.log("Renovando token de acceso...");
try {
// Si es un nuevo login, asignamos los datos
if (user) {
token.id = user.id;
token.username = user.username;
token.fullname = user.fullname;
token.email = user.email;
token.role = user.role;
token.access_token = user.access_token;
token.access_expire_in = user.access_expire_in;
token.refresh_token = user.refresh_token;
token.refresh_expire_in = user.refresh_expire_in;
return token; // IMPORTANTE: retornamos el token aquí para evitar que entre en el siguiente 'if'
const res = await resfreshTokenAction({ token: token.refresh_token as string });
if (!res || !res.tokens) {
throw new Error('Fallo en la respuesta de la API de refresco.');
}
// Verificar si el access_token ha expirado
const now = Date.now() / 1000;
if (now < (token.access_expire_in as number)) {
return token; // Si el token no ha expirado, lo retornamos sin cambios
}
console.log("Old Access Expire:", token.access_expire_in);
console.log("New Access Expire:", res.tokens.access_expire_in);
// Si el access_token ha expirado, verificar el refresh_token
if (now > (token.refresh_expire_in as number)) {
console.log("Refresh token ha expirado. Forzando logout.");
return null; // Forzar logout
}
// Si el access_token ha expirado pero el refresh_token es válido, renovar
console.log("Renovando token de acceso...");
const res = await resfreshTokenAction({
token: token.refresh_token as string,
});
console.log("Pepe");
console.log("token:", token.refresh_token);
if (!res) throw new Error('Fallo al renovar el token');
// Actualizar el token directamente con los nuevos valores
token.access_token = res.tokens.access_token;
token.access_expire_in = res.tokens.access_expire_in;
token.refresh_token = res.tokens.refresh_token;
token.refresh_expire_in = res.tokens.refresh_expire_in;
return token;
// Actualizar el token con la nueva información
return {
...token,
access_token: res.tokens.access_token,
access_expire_in: res.tokens.access_expire_in,
refresh_token: res.tokens.refresh_token,
refresh_expire_in: res.tokens.refresh_expire_in,
};
} catch (error) {
console.error("Error al renovar el token: ", error);
return null; // Fallo al renovar, forzar logout
}
},
async session({ session, token }: { session: Session; token: DefaultJWT }) {
async session({ session, token }: { session: Session; token: any }) {
session.access_token = token.access_token as string;
session.access_expire_in = token.access_expire_in as number;
session.refresh_token = token.refresh_token as string;