@@ -228,6 +228,63 @@ export const authConfig = {
228228 token . username = extendedUser . username ;
229229 token . profile = extendedUser . profile ;
230230 }
231+
232+ // Check if access token is expired and try to refresh
233+ if ( token . accessToken && typeof token . accessToken === 'string' ) {
234+ try {
235+ const base64Url = token . accessToken . split ( '.' ) [ 1 ] ;
236+ const base64 = base64Url . replace ( / - / g, '+' ) . replace ( / _ / g, '/' ) ;
237+ const jsonPayload = decodeURIComponent (
238+ atob ( base64 )
239+ . split ( '' )
240+ . map ( function ( c ) {
241+ return '%' + ( '00' + c . charCodeAt ( 0 ) . toString ( 16 ) ) . slice ( - 2 ) ;
242+ } )
243+ . join ( '' )
244+ ) ;
245+ const payload = JSON . parse ( jsonPayload ) ;
246+ const currentTime = Math . floor ( Date . now ( ) / 1000 ) ;
247+
248+ // If token is expired and we have a refresh token, try to refresh
249+ if ( payload . exp < currentTime && token . refreshToken ) {
250+ try {
251+ const response = await fetch (
252+ `${ process . env . NEXT_PUBLIC_API_URL } /auth/refresh` ,
253+ {
254+ method : 'POST' ,
255+ headers : {
256+ 'Content-Type' : 'application/json' ,
257+ } ,
258+ body : JSON . stringify ( { refreshToken : token . refreshToken } ) ,
259+ }
260+ ) ;
261+
262+ if ( response . ok ) {
263+ const data = await response . json ( ) ;
264+ token . accessToken = data . data . accessToken ;
265+ token . refreshToken = data . data . refreshToken ;
266+ AuthLogger . log ( 'Token refreshed successfully' ) ;
267+ } else {
268+ // Refresh failed, clear tokens
269+ token . accessToken = null ;
270+ token . refreshToken = null ;
271+ AuthLogger . warn ( 'Token refresh failed' ) ;
272+ }
273+ } catch ( error ) {
274+ // Refresh failed, clear tokens
275+ token . accessToken = null ;
276+ token . refreshToken = null ;
277+ AuthLogger . error ( 'Token refresh error' , error as Error ) ;
278+ }
279+ }
280+ } catch ( error ) {
281+ // Token parsing failed, clear tokens
282+ token . accessToken = null ;
283+ token . refreshToken = null ;
284+ AuthLogger . error ( 'Token parsing error' , error as Error ) ;
285+ }
286+ }
287+
231288 return token ;
232289 } ,
233290
@@ -253,6 +310,11 @@ export const authConfig = {
253310 } ;
254311 } ;
255312
313+ // If no valid tokens, return empty session
314+ if ( ! extendedToken . accessToken ) {
315+ return session ;
316+ }
317+
256318 // Populate session with extended user data
257319 session . user = {
258320 ...session . user ,
0 commit comments