feat(auth): aumentar validade do token de acesso para 1 semana
This commit is contained in:
parent
6d0cf3c851
commit
2ca14c8421
2 changed files with 52 additions and 36 deletions
|
|
@ -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() {}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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(
|
|
||||||
(userData: LoginResponse) => {
|
|
||||||
const issuedAt = new Date(userData.issuedAt).getTime()
|
|
||||||
const expiresAt = issuedAt + userData.expiresIn * 1000
|
|
||||||
const now = Date.now()
|
|
||||||
|
|
||||||
if (now >= expiresAt) {
|
|
||||||
logout()
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Se expirar em menos de 5 min, renova
|
|
||||||
if (expiresAt - now < 300000) {
|
|
||||||
renewToken(userData.refreshToken)
|
|
||||||
}
|
|
||||||
|
|
||||||
return true
|
|
||||||
},
|
|
||||||
[logout, renewToken]
|
|
||||||
)
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
const storedUser = localStorage.getItem(STORAGE_KEYS.USER)
|
const initAuth = async () => {
|
||||||
if (storedUser) {
|
const storedUser = localStorage.getItem(STORAGE_KEYS.USER)
|
||||||
try {
|
if (storedUser) {
|
||||||
const userData: LoginResponse = JSON.parse(storedUser)
|
try {
|
||||||
if (checkTokenExpiration(userData)) {
|
const userData: LoginResponse = JSON.parse(storedUser)
|
||||||
setUser(userData)
|
const issuedAt = new Date(userData.issuedAt).getTime()
|
||||||
setupActiveOrg(userData.organizations)
|
const expiresAt = issuedAt + userData.expiresIn * 1000
|
||||||
|
const now = Date.now()
|
||||||
|
|
||||||
|
if (now >= expiresAt) {
|
||||||
|
if (userData.refreshToken) {
|
||||||
|
const renewed = await renewToken(userData.refreshToken)
|
||||||
|
if (renewed) {
|
||||||
|
setupActiveOrg(renewed.organizations)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
logout()
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
setUser(userData)
|
||||||
|
setupActiveOrg(userData.organizations)
|
||||||
|
|
||||||
|
// Se expirar em menos de 24 horas, renova proativamente
|
||||||
|
if (expiresAt - now < 86400000 && userData.refreshToken) {
|
||||||
|
renewToken(userData.refreshToken)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
localStorage.removeItem(STORAGE_KEYS.USER)
|
||||||
}
|
}
|
||||||
} catch {
|
|
||||||
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)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue