Buscar en la documentación

password_reset_codes

Solicitudes de recuperación de contraseña con su código, intentos, vencimiento y pase.

Módulo auth1 min de lecturaVer en GitHub

Una fila por solicitud de recuperación de contraseña. Solo una por persona está vigente: pedir un código nuevo anula las anteriores.

ColumnaTipoRestriccionesDescripción
idBIGINT UNSIGNEDPK
user_idBIGINT UNSIGNEDFK → users.id, CASCADEDueño de la solicitud; se va con la cuenta
code_hashCHAR(64)NOT NULLHMAC-SHA256 del código de 6 dígitos con la clave de la aplicación
attemptsTINYINT UNSIGNEDNOT NULL, por defecto 0Fallos del código o del segundo factor; a los 5 se anula
expires_atTIMESTAMPNOT NULLEl código vale 15 minutos
ticket_hashCHAR(64)NULLHMAC del pase que entrega el código ya verificado
ticket_expires_atTIMESTAMPNULLEl pase vale 10 minutos
used_atTIMESTAMPNULLUsada o anulada (por un código nuevo o por intentos): ya no sirve
created_atTIMESTAMPNOT NULL

Por qué HMAC y no un hash simple

El código tiene un millón de combinaciones. Con un SHA-256 simple, quien tuviera una copia de la base lo encontraría en segundos. El HMAC usa la clave de la aplicación, que no está en la base: sin ella no se puede calcular.

Índices

ÍndiceUso
(user_id, used_at)La solicitud vigente de una persona (la más reciente sin usar)

Dónde está en el código