gabrielb 5e528f234b
All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m36s
feat(auth): adicionar tratamento de erro ao salvar estado PKCE
feat(proxy): melhorar tratamento de erro para backend inacessível
feat(certidao): adicionar validação de CPF e CNPJ
feat(iptu): ajustar manipulação de dados de imóveis retornados
feat(error): criar componente de erro para exibição de mensagens
2026-05-25 18:59:41 -03:00

42 lines
1.3 KiB
TypeScript

import { z } from 'zod'
const bodySchema = z.object({
documento: z.string().trim().min(11).max(20).optional(),
returnTo: z.string().startsWith('/').max(200).optional(),
primary: z.string().regex(/^[0-9a-fA-F]{6}$/).optional(),
dark: z.boolean().optional(),
})
export default defineEventHandler(async (event) => {
const body = await readValidatedBody(event, bodySchema.safeParse)
if (!body.success) {
throw createError({ statusCode: 400, statusMessage: 'Body inválido' })
}
const { codeVerifier, codeChallenge, state } = await generatePkce()
const returnTo = body.data.returnTo ?? '/portal/painel'
try {
await savePkceState(state, {
codeVerifier,
returnTo,
createdAt: Date.now(),
})
} catch (err) {
console.error('[auth/login] falha ao salvar estado PKCE (Redis indisponível?):', (err as Error).message)
throw createError({ statusCode: 503, statusMessage: 'Serviço temporariamente indisponível. Tente novamente em instantes.' })
}
const redirectUri = callbackUrlFromEvent(event)
const authUrl = buildAuthUrl({
codeChallenge,
state,
redirectUri,
loginHint: body.data.documento?.replace(/\D/g, ''),
primary: body.data.primary,
dark: body.data.dark,
})
return { authUrl }
})