Saltar al contenido
Índice de Kit UI
Kit UI Componentes

Segundo factor.

Patrón canónico de segundo factor para cuenta, admin, usaia, firmas y documentos.

Verlo por niveles

Primero el componente, después la variación de marca y finalmente su uso dentro de una página.

Nivel 1Componente canónico

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación
Nivel 2Círculo de Santiago · variación

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación
Nivel 3Dentro de una página
Sitio · sección

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación
Ver y copiar el código de este render
HTML del nivel canónico
<form class="ui-sample ui-auth-fragment" data-auth-source="cis-auth-authentik" data-mfa-challenge="true"><h3>Verificación en dos pasos</h3><p>Ingresa el código de seis dígitos de tu aplicación.</p><label for="mfa-challenge-0">Código de verificación</label><input class="input ui-one-time-code" id="mfa-challenge-0" inputMode="numeric" autoComplete="one-time-code" pattern="[0-9]{6}" required="" value=""/><button class="btn btn--primary" type="submit">Verificar</button><a class="btn btn--quiet" href="#backup">Usar un código de recuperación</a></form>

Variaciones por marca y sitio

Cada cambio visible declara su autoridad; lo que permanece canónico no se vuelve a inventar en el producto.

innovacionsantiago.cl

Compañía de Innovación de Santiago

Autoridad: CONSTITUTION.md + LOGOS-CANONICOS.md

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación

Cambia en esta marca

  • Navegación y contenido propios del servicio
  • Acento reservado para acciones y datos

Permanece canónico

  • Mark CIS y namebrand de tres líneas
  • IBM Plex Sans, foco, espaciado y anatomía
circulodesantiago.cl

Círculo de Santiago

Autoridad: core-style/DECISIONES.md M10 y LOGOS-CANONICOS.md

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación

Cambia en esta marca

  • Mark circular y namebrand Círculo de Santiago en caja normal
  • Contenido societario y navegación propia

Permanece canónico

  • Misma estructura, orden de cuenta y footer
  • Tipografía, foco y comportamiento canónicos

Comparación histórica recuperable

Compara la propuesta con cortes reales del repositorio. La ausencia de una muestra se declara y nunca se reconstruye de memoria.

Estado actual
Segundo factor no tiene una implementación vigente demostrada; sus ejemplos son material candidato.
Cambio propuesto
Publicar en r19 el contrato de Segundo factor para Patrón canónico de segundo factor para cuenta, admin, usaia, firmas y documentos.
Qué ocurre si respondes No
Segundo factor queda fuera de r19 y sus ejemplos siguen sólo como evidencia pendiente de reformulación.

Preparando comparación histórica…

Antes / r19

La comparación convierte una regla abstracta en una diferencia visible y verificable.

r19 · correctoContrato canónico renderizado

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación
  • Usa HTML semántico, foco visible y estados explícitos.
  • Conserva contenido útil a 320 px y sin JavaScript.
Antes · problema observadoAnti-ejemplo no interactivo
correo@ejemplo.cl!Algo salió mal
  • No agregues sombras, radios ni franjas laterales decorativas.
  • No uses color, placeholder o icono como única explicación.

Responsive

La misma anatomía debe conservar lectura, foco y acciones sin cortar contenido ni crear scroll horizontal en la página.

320 pxMóvil y zoom

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación
1280 pxEscritorio

Verificación en dos pasos

Ingresa el código de seis dígitos de tu aplicación.

Usar un código de recuperación

Cobertura

DimensiónContrato
Propietario canónicoSistema de diseño CIS y cis-auth · core/core-style
ConsumidoresCuenta, Admin, usaia, Firmas y Documentos
DependenciasHTML nativo, validación de servidor
Estadocandidato

Evidencia de adopción

Patrón propuesto. 0 implementaciones observadas en 0 repositorios.

La observación demuestra uso existente; la aceptación canónica sigue dependiendo de esta ficha y de su propietario.

DatoResultado
ClasificaciónPatrón propuesto
Implementaciones0 implementaciones observadas
RepositoriosNingún repositorio observado
Snapshotkit/componentes/componentes-observados.json

Consumidores observados

El inventario conserva repositorio, archivo fuente y criterio de asociación. Observar una implementación no la convierte automáticamente en canónica.

Estados

Estado requerido
vacío
completo
inválido
disabled

Accesibilidad

  • Conserva nombre accesible, orden de lectura y foco visible.
  • Funciona a 320 px, con zoom de 200% y texto largo.
  • El color nunca es la única señal de estado o acción.
  • El contenido esencial permanece disponible sin JavaScript.

Código HTML

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<form class="ui-sample ui-auth-fragment" data-auth-source="cis-auth-authentik" data-mfa-challenge="true"><h3>Verificación en dos pasos</h3><p>Ingresa el código de seis dígitos de tu aplicación.</p><label for="mfa-challenge-0">Código de verificación</label><input class="input ui-one-time-code" id="mfa-challenge-0" inputMode="numeric" autoComplete="one-time-code" pattern="[0-9]{6}" required="" value=""/><button class="btn btn--primary" type="submit">Verificar</button><a class="btn btn--quiet" href="#backup">Usar un código de recuperación</a></form>

Código TAILWIND

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
<form class="ui-sample ui-auth-fragment border border-slate-300 bg-white p-4 text-slate-950 grid gap-3" data-auth-source="cis-auth-authentik" data-mfa-challenge="true"><h3>Verificación en dos pasos</h3><p>Ingresa el código de seis dígitos de tu aplicación.</p><label for="mfa-challenge-0">Código de verificación</label><input class="input ui-one-time-code border border-slate-400 bg-white px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2" id="mfa-challenge-0" inputMode="numeric" autoComplete="one-time-code" pattern="[0-9]{6}" required="" value=""/><button class="btn btn--primary border border-slate-950 px-3 py-2 focus-visible:outline-2 focus-visible:outline-offset-2 disabled:cursor-not-allowed" type="submit">Verificar</button><a class="btn btn--quiet underline underline-offset-4" href="#backup">Usar un código de recuperación</a></form>

Código REACT

Copia el bloque completo; después cambia contenido y destinos, no su anatomía.

Código de referencia
import type { ChangeEventHandler, FormEventHandler } from "react";

export interface MfaChallengeProps {
  title?: string;
  /** Indicación sobre dónde obtener el código. */
  description?: string;
  /** Ruta que recibe el formulario; sin ella, el navegador envía a la URL actual. */
  action?: string;
  /** Pasa `post`: sin `method`, el navegador envía por GET y el código queda en la URL y en el historial. */
  method?: "post" | "get";
  onSubmit?: FormEventHandler<HTMLFormElement>;
  /** Etiqueta visible del campo del código. */
  label?: string;
  /** Id del campo del código. Usa uno distinto por campo en la página. */
  id?: string;
  name?: string;
  /** Expresión que valida el código; por defecto, seis dígitos. */
  pattern?: string;
  /** Valor inicial de un campo no controlado. */
  defaultValue?: string;
  /** Valor de un campo controlado; va junto con `onChange`. */
  value?: string;
  /** Se llama en cada cambio, con o sin `value`. */
  onChange?: ChangeEventHandler<HTMLInputElement>;
  /** Texto del botón que envía el formulario. */
  submitLabel?: string;
  /** Texto del enlace al código de recuperación; se muestra como acción terciaria (`btn--quiet`). */
  backupLabel?: string;
  backupHref?: string;
  className?: string;
}

/**
 * Formulario de verificación en dos pasos, para pedir el código de la aplicación autenticadora después de la contraseña.
 *
 * El campo usa `autoComplete="one-time-code"` y teclado numérico, y ofrece un enlace al código de recuperación.
 * Para enviar sin JavaScript, pasa `action` y `method="post"`; así el código no queda en la URL.
 *
 * @example <MfaChallenge id="codigo" name="code" action="/auth/mfa" method="post" />
 * @example <MfaChallenge id="codigo" value={codigo} onChange={cambiar} onSubmit={verificar} />
 */
export function MfaChallenge({
  title = "Verificación en dos pasos",
  description = "Ingresa el código de seis dígitos de tu aplicación.",
  action,
  method,
  onSubmit,
  label = "Código de verificación",
  id = "mfa-challenge-0",
  name,
  pattern = "[0-9]{6}",
  defaultValue = "",
  value,
  onChange,
  submitLabel = "Verificar",
  backupLabel = "Usar un código de recuperación",
  backupHref = "#backup",
  className,
}: MfaChallengeProps) {
  const controlado = value !== undefined && onChange !== undefined;
  return (
    <form
      className={["ui-auth-fragment", className].filter(Boolean).join(" ")}
      data-auth-source="cis-auth-authentik"
      data-mfa-challenge
      action={action}
      method={method}
      onSubmit={onSubmit}
    >
      <h3>{title}</h3>
      {description ? <p>{description}</p> : null}
      <label htmlFor={id}>{label}</label>
      <input
        className="input ui-one-time-code"
        id={id}
        name={name}
        inputMode="numeric"
        autoComplete="one-time-code"
        pattern={pattern}
        required
        {...(controlado ? { value, onChange } : { defaultValue: value ?? defaultValue, onChange })}
      />
      <button className="btn btn--primary" type="submit">{submitLabel}</button>
      {backupLabel ? <a className="btn btn--quiet" href={backupHref}>{backupLabel}</a> : null}
    </form>
  );
}