99 lines
2.2 KiB
TypeScript
99 lines
2.2 KiB
TypeScript
|
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
|
||
|
}
|
||
|
}
|