Segurança
Sessões e segurança para um produto de IA. Dispositivos ativos com encerramento de sessão que anima a saída das linhas, troca de senha com um medidor de força em tempo real, configuração de autenticação em duas etapas com um QR code real, uma verificação de 6 dígitos e códigos de recuperação para baixar, passkeys via WebAuthn e exclusão de conta protegida por uma confirmação digitada.
Todo produto de IA acaba com a mesma página de segurança: onde você está conectado, como você entra e como sair. O Security é essa página, construída sobre os grupos e as linhas do bloco Settings, com cada fluxo ligado a callbacks assíncronos que você controla.
Active sessions lista cada dispositivo com seu navegador, sistema, localização e quando esteve ativo pela última vez, em tempo relativo simples. Este dispositivo é marcado e não pode ser desconectado a partir daqui. Encerrar a sessão de um dispositivo mostra o progresso em seu botão, depois a linha se dobra e o foco vai para a próxima linha. Encerrar todas as outras pergunta antes e cita os dispositivos que serão desconectados.
Change password verifica enquanto você digita: um medidor de força de quatro etapas e uma lista do que ainda falta, sem bloquear nada do que você digita. Se o seu servidor disser que a senha atual está errada, a mensagem aparece sob esse campo e o foco volta a ele, com tudo o que você digitou preservado. Você pode encerrar as outras sessões na mesma etapa.
A configuração da autenticação em duas etapas desenha um QR code de verdade, escaneável, para o link otpauth que o seu servidor retorna, mostra a chave de configuração com um botão de copiar para quando escanear não é possível e, no celular, oferece abrir o link em um app autenticador. O código de 6 dígitos se verifica assim que está completo, sacode e se limpa se estiver errado e depois mostra os códigos de recuperação para copiar ou baixar como arquivo de texto. Desativar pergunta antes.
Passkeys chama o seu fluxo WebAuthn e trata as respostas do navegador: fechar o prompt não adiciona nada e não mostra erro, e um dispositivo que já tem uma passkey informa isso. Excluir a conta exige a frase exata, lista o que vai junto e mantém o diálogo aberto com a sua mensagem se o servidor disser não.
Adicione o registro Pro ao components.json
components.json Adicione seu token
Crie um token na sua página de conta e coloque-o em
.env.localcomoHEXTAUI_PRO_TOKEN.Adicione o bloco
pnpm dlx shadcn@latest add @hextaui-pro/security
Conecte à sua API
Passe o que a conta tem agora e um callback assíncrono para cada ação. Resolva quando o servidor terminar e atualize os dados, e cada parte mostra seu próprio progresso. Lance um erro para mostrar a sua mensagem no lugar, e o que a pessoa digitou permanece.
Use as partes isoladamente
SecuritySessions, SecurityPasswordRow, SecurityTwoFactorRow, SecurityPasskeys e SecurityDeleteAccount funcionam cada um isoladamente, então você pode colocá-los em qualquer seção. Retorne erros de campo de onChangePassword para exibi-los sob o campo.
Anatomia
As partes que você compõe, de fora para dentro.
| Parte | Descrição |
|---|---|
SecuritySettings | Tudo abaixo em uma só chamada. Cada parte aparece quando você passa os dados e os callbacks de que ela precisa. |
SecuritySessions | Um grupo que lista os dispositivos conectados, com encerrar sessão por dispositivo e para todas as outras sessões. |
SecurityPasswordRow | Uma linha que abre o diálogo de alterar senha. |
SecurityTwoFactorRow | Uma linha com o status da autenticação em duas etapas, o diálogo de configuração e a confirmação para desativar. |
SecurityPasskeys | Um grupo que lista as passkeys, com adicionar e remover. |
SecurityDeleteAccount | Um grupo com a linha de excluir conta e sua confirmação digitada. |
measurePassword | A verificação de força que o diálogo de senha usa, para os seus próprios formulários. |
| Prop | Tipo | Padrão |
|---|---|---|
emailO e-mail da conta. Usado na frase de exclusão, na dica do gerenciador de senhas e no arquivo de códigos de recuperação. | string | – |
sessions{ id, browser, os, device?, location?, lastActive, current? }. device é "desktop", "laptop", "phone" ou "tablet". | SecuritySession[] | – |
onSignOutSessionEncerra uma sessão. Remova-a de sessions quando for resolvido e a linha se dobra. | (id: string) => Promise<void> | – |
onSignOutOtherSessionsEncerra todas as sessões, exceto a atual. Executa depois que a pessoa confirma. | () => Promise<void> | – |
passwordChangedAtExibido como Last changed sob Password. | Date | string | number | null | – |
onChangePasswordRetorne { currentPassword } ou { newPassword } para mostrar uma mensagem sob esse campo, ou lance um erro para mostrá-la acima dos botões. | ({ currentPassword, newPassword, signOutOthers }) => Promise<void | errors> | – |
twoFactorEnabledSe a autenticação em duas etapas está ativada. | boolean | false |
onStartTwoFactorCria um segredo pendente quando o diálogo de configuração abre. uri é o link otpauth desenhado como QR code; secret usa por padrão o que está em uri. | () => Promise<{ uri, secret?, recoveryCodes? }> | – |
onVerifyTwoFactorVerifica o código de 6 dígitos e ativa a autenticação em duas etapas. Retorne os códigos de recuperação para exibi-los, ou lance um erro se o código estiver errado. | (code: string) => Promise<void | string[]> | – |
onDisableTwoFactorDesativa a autenticação em duas etapas. Executa depois que a pessoa confirma. | () => Promise<void> | – |
passkeys{ id, name, createdAt, lastUsed? }. | SecurityPasskey[] | – |
onAddPasskeyExecuta o seu registro WebAuthn. Um NotAllowedError ou AbortError conta como cancelado e não mostra nada. | () => Promise<void> | – |
onRemovePasskeyRemove uma passkey. Executa depois que a pessoa confirma. | (id: string) => Promise<void> | – |
passkeysSupportedSubstitui a verificação de suporte a WebAuthn. | boolean | detected |
onDeleteAccountExclui a conta. Executa depois que a pessoa digita a frase. Lance um erro para manter o diálogo aberto com a sua mensagem. | () => Promise<void> | – |
deleteConsequencesO que é excluído, listado na confirmação. | ReactNode[] | – |
SecuritySessions
Também aceita todas as props do SettingsGroup.
| Prop | Tipo | Padrão |
|---|---|---|
sessionsOs dispositivos conectados. | SecuritySession[] | – |
onSignOutEncerra uma sessão. | (id: string) => Promise<void> | – |
onSignOutOthersEncerra todas as outras sessões. | () => Promise<void> | – |
titleO título do grupo. | ReactNode | "Active sessions" |
| Prop | Tipo | Padrão |
|---|---|---|
emailPreenchido em um campo de nome de usuário oculto para que os gerenciadores de senhas atualizem o login correto. | string | – |
changedAtQuando a senha foi alterada pela última vez. | Date | string | number | null | – |
onChangePasswordIgual ao do SecuritySettings. | (change) => Promise<void | errors> | – |
| Prop | Tipo | Padrão |
|---|---|---|
emailCitado na confirmação e no arquivo de códigos de recuperação. | string | – |
enabledSe a autenticação em duas etapas está ativada. | boolean | – |
onStartIgual a onStartTwoFactor. | () => Promise<{ uri, secret?, recoveryCodes? }> | – |
onVerifyIgual a onVerifyTwoFactor. | (code: string) => Promise<void | string[]> | – |
onDisableIgual a onDisableTwoFactor. | () => Promise<void> | – |
SecurityPasskeys
Também aceita todas as props do SettingsGroup.
| Prop | Tipo | Padrão |
|---|---|---|
passkeysAs passkeys salvas. | SecurityPasskey[] | – |
onAddExecuta o seu registro WebAuthn. | () => Promise<void> | – |
onRemoveRemove uma passkey. | (id: string) => Promise<void> | – |
supportedSe este navegador pode criar passkeys. | boolean | detected |
SecurityDeleteAccount
Também aceita todas as props do SettingsGroup.
| Prop | Tipo | Padrão |
|---|---|---|
emailA frase de confirmação é delete seguido disto. | string | – |
onDeleteExclui a conta. | () => Promise<void> | – |
consequencesO que é excluído junto. | ReactNode[] | – |
titleO título do grupo. | ReactNode | "Danger zone" |
| Tecla | Ação |
|---|---|
| Tab | Percorre as linhas e seus botões, depois cada diálogo. |
| Enter | Envia o formulário de senha a partir de qualquer campo e exclui a conta a partir do campo da frase quando ela corresponde. |
| Escape | Fecha um diálogo, exceto enquanto algo está sendo salvo. |
| 0–9 | Preenche o código de verificação. Ele se verifica sozinho quando os seis dígitos estão preenchidos, e colar um código também funciona. |
- Ações destrutivas nunca recebem o foco primeiro. As confirmações citam o que afetam, como os dispositivos que serão desconectados ou o e-mail que será excluído, e o campo da frase de exclusão recebe o foco no lugar do botão.
- Quando uma linha se dobra, o foco vai para o botão da próxima linha, ou da anterior, para nunca cair na página. Fechar um diálogo devolve o foco ao botão que o abriu, ou ao seu substituto quando esse botão não existe mais.
- Os encerramentos de sessão, as passkeys adicionadas e removidas e a força da senha são anunciados de forma polite. Os erros dos seus callbacks são anunciados como alertas e permanecem ao lado do campo ou botão a que pertencem.
- Cada requisito de senha informa se foi atendido, o QR code tem um rótulo de texto, e a chave de configuração e os códigos de recuperação são texto legível que você pode selecionar.
- Com movimento reduzido, as linhas esmaecem em vez de se dobrar e as mudanças de etapa não deslizam. No modo de alto contraste, o QR code e o medidor de força mantêm suas formas.
Construído com
Os componentes gratuitos do HextaUI de que Security é feito. Cada um é instalado separadamente.
Código
12 arquivos, adicionados a components/blocks/security.