transcription-cost-usage-re.../frontend/lib/auth.ts

99 lines
2.2 KiB
TypeScript
Raw Normal View History

interface JWTPayload {
fresh: boolean
iat: number
jti: string
type: string
sub: string
nbf: number
csrf: string
exp: number
roles: string[]
}
export function decodeJWT(token: string): JWTPayload | null {
try {
// JWT tem 3 partes separadas por pontos: header.payload.signature
const parts = token.split(".")
if (parts.length !== 3) {
return null
}
// Decodificar a parte do payload (segunda parte)
const payload = parts[1]
// Adicionar padding se necessário para base64
const paddedPayload = payload + "=".repeat((4 - (payload.length % 4)) % 4)
// Decodificar de base64
const decodedPayload = atob(paddedPayload)
// Parse do JSON
const parsedPayload: JWTPayload = JSON.parse(decodedPayload)
return parsedPayload
} catch (error) {
console.error("Erro ao decodificar JWT:", error)
return null
}
}
export function getUserRoles(): string[] {
try {
const token = localStorage.getItem("access_token")
if (!token) {
return []
}
const payload = decodeJWT(token)
return payload?.roles || []
} catch (error) {
console.error("Erro ao obter roles do usuário:", error)
return []
}
}
export function hasRole(role: string): boolean {
const roles = getUserRoles()
return roles.includes(role)
}
export function isAdmin(): boolean {
return hasRole("admin")
}
export function getCurrentUserEmail(): string | null {
try {
const token = localStorage.getItem("access_token")
if (!token) {
return null
}
const payload = decodeJWT(token)
return payload?.sub || null
} catch (error) {
console.error("Erro ao obter email do usuário:", error)
return null
}
}
export function isTokenExpired(): boolean {
try {
const token = localStorage.getItem("access_token")
if (!token) {
return true
}
const payload = decodeJWT(token)
if (!payload) {
return true
}
// exp está em segundos, Date.now() está em milissegundos
const currentTime = Math.floor(Date.now() / 1000)
return payload.exp < currentTime
} catch (error) {
console.error("Erro ao verificar expiração do token:", error)
return true
}
}