All checks were successful
Dev Build & Deploy Portal / build-deploy (push) Successful in 2m36s
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
42 lines
1.3 KiB
TypeScript
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 }
|
|
})
|