import { resfreshTokenAction } from '@/feactures/auth/actions/refresh-token-action'; import { auth } from '@/lib/auth'; import { cookies } from 'next/headers'; import { cache } from 'react'; export const getValidAccessToken = cache(async () => { const session = await auth(); if (!session?.access_token) { // console.log('No hay Access Token'); return null } // console.log('Si hay Access Token'); const now = Math.floor(Date.now() / 1000); // Restamos 10s para tener margen de seguridad const isValid = (session.access_expire_in as number) - 10 > now; // A. Si es válido, lo retornamos directo if (isValid) return session.access_token; // console.log('Access Token Expiró'); // B. Si expiró, buscamos la cookie const cookieStore = cookies(); const refreshTokenCookie = await cookieStore const refreshToken = refreshTokenCookie.get('refresh_token')?.value; if (!refreshToken) { // console.log('No hay Refresh Token'); return null } // No hay refresh token, fin del juego // console.log('Si hay Refresh Token'); // C. Intentamos refrescar const newTokens = await resfreshTokenAction({ refreshToken }); if (!newTokens) { // console.log('No hay token nuevo'); // Si falla el refresh (token revocado o expirado), borramos cookie (await cookieStore).delete('refresh_token'); (await cookieStore).delete('authjs.session-token'); return null; } // console.log('Si hay token nuevo'); // D. Guardamos el nuevo refresh token en cookie y retornamos el access token (await cookieStore).set('refresh_token', newTokens.refresh_token, { httpOnly: true, secure: process.env.NODE_ENV === 'production', sameSite: 'lax', path: '/', maxAge: 7 * 24 * 60 * 60, }); // (await cookieStore).set('authjs.session-token', newTokens.access_token, { // httpOnly: true, // secure: process.env.NODE_ENV === 'production', // sameSite: 'lax', // path: '/', // maxAge: 7 * 24 * 60 * 60, // }); return newTokens.access_token; });