Cargando…

Esto está tardando más de lo esperado.

Volver al centro de ayuda

El PIN de seguridad

Un código de cuatro dígitos que la persona define una vez y escribe antes de acciones sensibles.

El PIN es un segundo secreto, más corto que la contraseña, que una persona escribe para confirmar una acción desde dentro de la aplicación. Viene apagado. Esta guía cubre cómo encenderlo, qué le pide a tus usuarios, cómo exigirlo desde tu propio código y cómo se restablece.

Qué es

Cuatro dígitos, exactamente. Se guarda con hash en la columna pin de users, con el mismo hash que la contraseña, así que no se puede leer de vuelta, ni siquiera desde el panel de administración. Definir un PIN con algo distinto de cuatro dígitos se rechaza con "El PIN debe ser de 4 dígitos", y un valor vacío deja intacto el PIN guardado.

Encenderlo

AUTH_ENABLE_PIN=true

Ese es todo el interruptor: enable_pin en config/auth.php, false por omisión. Cambian cuatro cosas:

  • Aparece una tarjeta "PIN de seguridad" en el perfil en /account, con el texto "Configura un PIN de 4 dígitos para confirmar tu identidad en acciones importantes." y el formulario para crearlo.
  • Toda persona con sesión y sin PIN ve una barra de aviso en la parte superior de la aplicación en cada página: "Necesitas configurar un PIN para tu cuenta." con un enlace "Configurar PIN" al perfil. La barra desaparece cuando el PIN se guarda. Mientras tanto nada se bloquea.
  • El diálogo de confirmación que se describe abajo pide el PIN en lugar de la contraseña.
  • El formulario de usuario del panel de administración gana un campo "Pin" y una acción "Restablecer PIN".

Apagarlo oculta todo eso. Los PIN guardados se conservan y simplemente se ignoran.

Qué hace la persona

En la tarjeta "PIN de seguridad", cuatro casillas bajo "Crear PIN" y cuatro bajo "Confirmar PIN", un dígito cada una, y un botón "Crear PIN". Cuando ya existe un PIN, la tarjeta pide el "PIN actual" antes de un "Nuevo PIN" y deja actualizarlo. No hay un camino de "olvidé mi PIN": un PIN perdido lo restablece un administrador. La tarjeta, con el resto del perfil, se describe en /help/your-account-area.

Exigir el PIN desde tu propio código

El kit te da un diálogo de confirmación que abres desde cualquier componente Livewire con el trait App\Traits\ConfirmsUserActions:

use App\Traits\ConfirmsUserActions;
use Livewire\Component;

class CloseProject extends Component
{
    use ConfirmsUserActions;

    public function close(int $projectId)
    {
        $this->requiresUserConfirmation('performClose', ['projectId' => $projectId]);
    }

    public function performClose($user, int $projectId)
    {
        // Corre sólo después de confirmar el PIN, o la contraseña.
        // $user es el App\Models\User confirmado.
    }
}

requiresUserConfirmation($method, $params) abre la ventana modal "Confirmar acción". Lo que pide depende de la configuración y de la persona:

Situación Campo
AUTH_ENABLE_PIN=true y la persona tiene PIN "PIN", cuatro dígitos
AUTH_ENABLE_PIN=true y la persona aún no tiene PIN "Contraseña"
AUTH_ENABLE_PIN=false "Contraseña"

Así que el PIN protege una acción sólo para quienes lo definieron; hasta entonces la contraseña hace el trabajo. Al confirmar, la ventana cierra y tu $method se llama con el usuario confirmado primero y tus $params después, en orden. Un valor equivocado responde "Credenciales inválidas." y la ventana sigue abierta. Cancelar la cierra y nada corre.

La ventana también funciona para un visitante sin sesión: entonces agrega un campo de identidad etiquetado con las identidades de LOGIN_IDENTITIES, por ejemplo "correo electrónico / teléfono", busca la cuenta y pide el PIN cuando la función está encendida, o la contraseña en caso contrario.

Hoy ninguna pantalla del kit abre este diálogo por sí misma. Está ahí para las acciones de tu aplicación.

El trait App\Traits\HasPin

El modelo User lleva el trait; llama estos métodos sobre cualquier usuario:

Método Devuelve
hasPin() true cuando hay un PIN guardado
requiresPin() true cuando la función está encendida y esta persona aún no tiene PIN; la condición detrás de la barra de aviso
validatePin(string $pin) true cuando $pin coincide con el hash guardado; false cuando no hay nada guardado
resetPin() Borra el PIN y muestra "El PIN del usuario ha sido restablecido correctamente."

Definir el PIN es una asignación simple; el trait lo hashea y exige los cuatro dígitos:

$user->pin = '1234';
$user->save();

Restablecer un PIN

  • La persona: desde la tarjeta "PIN de seguridad", con el PIN actual.
  • Un administrador: en /admin/users, la página del usuario tiene una acción "Restablecer PIN", con icono de llave, que borra el PIN; la persona vuelve a la barra de aviso y crea uno nuevo. El formulario de usuario también tiene un campo "Pin", vacío en cada carga porque el hash nunca se muestra: escribe cuatro dígitos para definir un PIN nuevo para la cuenta, déjalo vacío para conservar el actual. Ambos aparecen sólo mientras AUTH_ENABLE_PIN=true, y la acción sólo para el rol admin.
  • Tu código: $user->resetPin().