feat(auth): aumentar validade do token de acesso para 1 semana

This commit is contained in:
Gabriel Menezes 2026-11-10 17:03:05 -04:00
parent 6d0cf3c851
commit 2ca14c8421
2 changed files with 52 additions and 36 deletions

View file

@ -2,8 +2,8 @@ package net.beetechgroup.beetask.usecase.auth;
public final class TokenConstants { public final class TokenConstants {
public static final long ACCESS_TOKEN_EXPIRY_SECONDS = 86400L; // 24 hours public static final long ACCESS_TOKEN_EXPIRY_SECONDS = 604800L; // 7 days (1 week)
public static final long REFRESH_TOKEN_EXPIRY_SECONDS = 604800L; // 7 days public static final long REFRESH_TOKEN_EXPIRY_SECONDS = 2592000L; // 30 days
private TokenConstants() {} private TokenConstants() {}
} }

View file

@ -67,58 +67,74 @@ export const AuthProvider = ({ children }: { children: ReactNode }) => {
response.issuedAt = new Date().toISOString() response.issuedAt = new Date().toISOString()
localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(response)) localStorage.setItem(STORAGE_KEYS.USER, JSON.stringify(response))
setUser(response) setUser(response)
return response
} catch { } catch {
logout() logout()
return null
} }
}, [logout]) }, [logout])
const checkTokenExpiration = useCallback( useEffect(() => {
(userData: LoginResponse) => { const initAuth = async () => {
const storedUser = localStorage.getItem(STORAGE_KEYS.USER)
if (storedUser) {
try {
const userData: LoginResponse = JSON.parse(storedUser)
const issuedAt = new Date(userData.issuedAt).getTime() const issuedAt = new Date(userData.issuedAt).getTime()
const expiresAt = issuedAt + userData.expiresIn * 1000 const expiresAt = issuedAt + userData.expiresIn * 1000
const now = Date.now() const now = Date.now()
if (now >= expiresAt) { if (now >= expiresAt) {
if (userData.refreshToken) {
const renewed = await renewToken(userData.refreshToken)
if (renewed) {
setupActiveOrg(renewed.organizations)
}
} else {
logout() logout()
return false
} }
} else {
// Se expirar em menos de 5 min, renova
if (expiresAt - now < 300000) {
renewToken(userData.refreshToken)
}
return true
},
[logout, renewToken]
)
useEffect(() => {
const storedUser = localStorage.getItem(STORAGE_KEYS.USER)
if (storedUser) {
try {
const userData: LoginResponse = JSON.parse(storedUser)
if (checkTokenExpiration(userData)) {
setUser(userData) setUser(userData)
setupActiveOrg(userData.organizations) setupActiveOrg(userData.organizations)
// Se expirar em menos de 24 horas, renova proativamente
if (expiresAt - now < 86400000 && userData.refreshToken) {
renewToken(userData.refreshToken)
}
} }
} catch { } catch {
localStorage.removeItem(STORAGE_KEYS.USER) localStorage.removeItem(STORAGE_KEYS.USER)
} }
} }
setIsLoading(false) setIsLoading(false)
}, [checkTokenExpiration, setupActiveOrg]) }
initAuth()
}, [logout, renewToken, setupActiveOrg])
// Verificação periódica a cada 60 segundos // Verificação periódica a cada 60 segundos
useEffect(() => { useEffect(() => {
if (!user) return if (!user) return
const interval = setInterval(() => { const interval = setInterval(() => {
checkTokenExpiration(user) const issuedAt = new Date(user.issuedAt).getTime()
const expiresAt = issuedAt + user.expiresIn * 1000
const now = Date.now()
if (now >= expiresAt) {
if (user.refreshToken) {
renewToken(user.refreshToken)
} else {
logout()
}
} else if (expiresAt - now < 86400000 && user.refreshToken) {
// Se expirar em menos de 24 horas, renova proativamente
renewToken(user.refreshToken)
}
}, 60000) }, 60000)
return () => clearInterval(interval) return () => clearInterval(interval)
}, [user, checkTokenExpiration]) }, [user, logout, renewToken])
const login = async (email: string, password: string) => { const login = async (email: string, password: string) => {
const response = await authService.login(email, password) const response = await authService.login(email, password)