Files
lic/front-end/app/composables/useAuth.ts
Junior e7016b6b10 feat: integra autenticação do front com API real
- useAuth.ts: substitui mock por $fetch no /auth/login e /auth/logout
- login.vue: adiciona campo "Organização" (slug) no formulário
- nuxt.config.ts: adiciona runtimeConfig.public.apiBase

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-14 12:35:19 -03:00

62 lines
1.9 KiB
TypeScript

interface AuthUser {
nome: string
email: string
papel: string
}
export function useAuth() {
const { public: { apiBase } } = useRuntimeConfig()
const user = useState<AuthUser | null>('auth_user', () => null)
const token = useCookie<string | null>('auth_token', { maxAge: 60 * 60 * 8 })
const refreshToken = useCookie<string | null>('refresh_token', { maxAge: 60 * 60 * 24 * 7 })
const isAuthenticated = computed(() => !!token.value)
// Restaura usuário do token ao recarregar
if (token.value && !user.value) {
try {
const payload = JSON.parse(atob(token.value.split('.')[1]))
user.value = { nome: payload.email.split('@')[0], email: payload.email, papel: payload.role }
} catch {
token.value = null
}
}
async function login(email: string, password: string, slug: string): Promise<{ success: boolean; error?: string }> {
try {
const res = await $fetch<{ access_token: string; refresh_token: string }>(`${apiBase}/auth/login`, {
method: 'POST',
body: { email, password, slug },
})
token.value = res.access_token
refreshToken.value = res.refresh_token
const payload = JSON.parse(atob(res.access_token.split('.')[1]))
user.value = { nome: payload.email.split('@')[0], email: payload.email, papel: payload.role }
return { success: true }
} catch (err: any) {
const msg = err?.data?.error || 'E-mail, senha ou organização incorretos.'
return { success: false, error: msg }
}
}
function logout() {
// Fire-and-forget logout no back (invalida refresh token)
if (refreshToken.value) {
$fetch(`${apiBase}/auth/logout`, {
method: 'POST',
body: { refresh_token: refreshToken.value },
}).catch(() => {})
}
token.value = null
refreshToken.value = null
user.value = null
navigateTo('/login')
}
return { user, isAuthenticated, login, logout }
}