feat: Implement proactive access token refreshing within the session and reactive token renewal for socket authentication errors.
This commit is contained in:
37
src/auth.ts
37
src/auth.ts
@@ -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;
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user