40 lines
1.2 KiB
TypeScript
40 lines
1.2 KiB
TypeScript
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)}`
|
|
}
|
|
}
|