feat: Implement proactive access token refreshing within the session and reactive token renewal for socket authentication errors.

This commit is contained in:
pradeepkumar
2026-02-11 04:47:51 +05:30
parent 692a91f6db
commit 50e593d7ae
3 changed files with 120 additions and 13 deletions

View File

@@ -154,7 +154,43 @@ export const { handlers, signIn, signOut, auth } = NextAuth({
token.role = (user as any).role;
token.accessToken = (user as any).accessToken;
token.refreshToken = (user as any).refreshToken;
// Store when the token was issued for expiration tracking
token.accessTokenIssuedAt = Date.now();
}
// Auto-refresh the access token if it's about to expire (refresh 2 minutes before expiry)
// Backend JWT_ACCESS_EXPIRATION=15m, so refresh at ~13 minutes
const ACCESS_TOKEN_MAX_AGE = 13 * 60 * 1000; // 13 minutes in ms
const issuedAt = (token.accessTokenIssuedAt as number) || 0;
if (token.accessToken && Date.now() - issuedAt > ACCESS_TOKEN_MAX_AGE) {
try {
const res = await fetch(
`${process.env.NEXT_PUBLIC_API_URL}/auth/refresh`,
{
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
refreshToken: token.refreshToken,
}),
}
);
const data = await res.json();
if (res.ok && data.success) {
token.accessToken = data.data.accessToken;
token.refreshToken = data.data.refreshToken;
token.accessTokenIssuedAt = Date.now();
} else {
// Refresh token is also expired - force re-login
token.error = "RefreshTokenExpired";
}
} catch (error) {
console.error("Token refresh error:", error);
token.error = "RefreshTokenError";
}
}
return token;
},
@@ -167,6 +203,7 @@ export const { handlers, signIn, signOut, auth } = NextAuth({
(session.user as any).role = token.role;
(session.user as any).accessToken = token.accessToken;
(session.user as any).refreshToken = token.refreshToken;
(session.user as any).error = token.error;
}
return session;
},