import { createHash, randomBytes } from 'node:crypto' /** * Gera hash seguro para token de recuperação usando pepper do servidor. * * @param rawToken Token bruto entregue ao cliente. * @param pepper Segredo adicional do ambiente. * @returns Hash SHA-256 do token. */ export function hashPasswordResetToken(rawToken: string, pepper: string): string { return createHash('sha256').update(`${rawToken}${pepper}`).digest('hex') } /** * Gera token aleatório para o fluxo de recuperação de senha. * * @returns Token em formato URL-safe. */ export function generateRawPasswordResetToken(): string { return randomBytes(32).toString('base64url') } /** * Monta uma URL de preview para facilitar testes locais sem SMTP. * * @param baseUrl URL pública usada para abrir a tela de redefinição. * @param token Token bruto de recuperação. * @returns URL completa (ou fallback relativo) com o token. */ export function buildPasswordResetPreviewUrl(baseUrl: string, token: string): string { try { const url = new URL('/auth/reset-password', baseUrl) url.searchParams.set('token', token) return url.toString() } catch { return `/auth/reset-password?token=${encodeURIComponent(token)}` } }