Sicherheit
Sitzungen und Sicherheit für ein KI-Produkt. Aktive Geräte mit Abmelden, bei dem Zeilen animiert verschwinden, eine Passwortänderung mit Live-Stärkeanzeige, Zwei-Faktor-Einrichtung mit echtem QR-Code, einer 6-stelligen Prüfung und herunterladbaren Wiederherstellungscodes, Passkeys über WebAuthn und Kontolöschung hinter einer getippten Bestätigung.
Jedes KI-Produkt landet bei derselben Sicherheitsseite: wo du angemeldet bist, wie du dich anmeldest und wie du dich abmeldest. Security ist diese Seite, gebaut auf den Gruppen und Zeilen des Settings-Blocks, wobei jeder Ablauf an asynchrone Callbacks angebunden ist, die dir gehören.
Active sessions listet jedes Gerät mit Browser, System, Standort und letzter Aktivität in einfacher relativer Zeit auf. Dieses Gerät ist markiert und kann von hier nicht abgemeldet werden. Das Abmelden eines Geräts zeigt den Fortschritt in seinem Button, dann klappt die Zeile weg, und der Fokus springt zur nächsten Zeile. Das Abmelden überall sonst fragt zuerst nach und nennt die Geräte, die abgemeldet werden.
Change password prüft beim Tippen: eine vierstufige Stärkeanzeige und eine Checkliste dessen, was noch fehlt, ohne etwas von dem zu blockieren, was du tippst. Sagt dein Server, dass das aktuelle Passwort falsch ist, erscheint die Meldung unter diesem Feld und der Fokus geht dorthin zurück, wobei alles Getippte erhalten bleibt. Im selben Schritt kannst du andere Sitzungen abmelden.
Die Zwei-Faktor-Einrichtung zeichnet einen echten, scanbaren QR-Code für den otpauth-Link, den dein Server zurückgibt, zeigt den Einrichtungsschlüssel mit einem Kopieren-Button für den Fall, dass Scannen nicht möglich ist, und bietet auf dem Smartphone an, den Link in einer Authenticator-App zu öffnen. Der 6-stellige Code prüft sich selbst, sobald er vollständig ist, wackelt und leert sich bei einem falschen Code und zeigt dann Wiederherstellungscodes zum Kopieren oder Herunterladen als Textdatei. Das Ausschalten fragt zuerst nach.
Passkeys ruft deinen WebAuthn-Ablauf auf und behandelt die Antworten des Browsers: Das Schließen der Abfrage fügt nichts hinzu und zeigt keinen Fehler, und ein Gerät, das bereits einen Passkey hat, sagt das. Das Löschen des Kontos erfordert die exakte Phrase, listet auf, was damit verschwindet, und hält den Dialog mit deiner Meldung offen, wenn der Server ablehnt.
Die Pro-Registry zu components.json hinzufügen
components.json Token hinzufügen
Erstelle auf deiner Kontoseite einen Token und trage ihn in
.env.localalsHEXTAUI_PRO_TOKENein.Den Block hinzufügen
pnpm dlx shadcn@latest add @hextaui-pro/security
An deine API anbinden
Übergib, was das Konto jetzt hat, und einen asynchronen Callback für jede Aktion. Löse auf, wenn der Server fertig ist, und aktualisiere die Daten, und jeder Teil zeigt seinen eigenen Fortschritt. Wirf einen Fehler, um deine Fehlermeldung an Ort und Stelle zu zeigen, und die Eingabe der Person bleibt erhalten.
Die Teile einzeln verwenden
SecuritySessions, SecurityPasswordRow, SecurityTwoFactorRow, SecurityPasskeys und SecurityDeleteAccount funktionieren jeweils allein, sodass du sie in jeden Bereich setzen kannst. Gib Feldfehler aus onChangePassword zurück, um sie unter dem Feld zu zeigen.
Aufbau
Die Teile, die du zusammensetzt, von außen nach innen.
| Part | Beschreibung |
|---|---|
SecuritySettings | Alles Folgende in einem Aufruf. Jeder Teil erscheint, wenn du die Daten und Callbacks übergibst, die er braucht. |
SecuritySessions | Eine Gruppe, die angemeldete Geräte auflistet, mit Abmelden pro Gerät und für alle anderen Sitzungen. |
SecurityPasswordRow | Eine Zeile, die den Dialog zum Ändern des Passworts öffnet. |
SecurityTwoFactorRow | Eine Zeile mit dem Zwei-Faktor-Status, dem Einrichtungsdialog und der Bestätigung zum Ausschalten. |
SecurityPasskeys | Eine Gruppe, die Passkeys auflistet, mit Hinzufügen und Entfernen. |
SecurityDeleteAccount | Eine Gruppe mit der Zeile zum Löschen des Kontos und ihrer getippten Bestätigung. |
measurePassword | Die Stärkeprüfung, die der Passwortdialog verwendet, für deine eigenen Formulare. |
| Prop | Typ | Standard |
|---|---|---|
emailDie E-Mail des Kontos. Wird in der Löschphrase, im Passwortmanager-Hinweis und in der Datei mit den Wiederherstellungscodes verwendet. | string | – |
sessions{ id, browser, os, device?, location?, lastActive, current? }. device ist "desktop", "laptop", "phone" oder "tablet". | SecuritySession[] | – |
onSignOutSessionMeldet eine Sitzung ab. Entferne sie aus sessions, wenn es aufgelöst ist, und die Zeile klappt weg. | (id: string) => Promise<void> | – |
onSignOutOtherSessionsMeldet jede Sitzung außer der aktuellen ab. Läuft, nachdem die Person bestätigt hat. | () => Promise<void> | – |
passwordChangedAtWird als Last changed unter Password angezeigt. | Date | string | number | null | – |
onChangePasswordGib { currentPassword } oder { newPassword } zurück, um eine Meldung unter diesem Feld zu zeigen, oder wirf einen Fehler, um sie über den Buttons zu zeigen. | ({ currentPassword, newPassword, signOutOthers }) => Promise<void | errors> | – |
twoFactorEnabledOb Zwei-Faktor aktiv ist. | boolean | false |
onStartTwoFactorErzeugt ein ausstehendes Secret, wenn sich der Einrichtungsdialog öffnet. uri ist der otpauth-Link, der als QR-Code gezeichnet wird; secret ist standardmäßig das aus uri. | () => Promise<{ uri, secret?, recoveryCodes? }> | – |
onVerifyTwoFactorPrüft den 6-stelligen Code und schaltet Zwei-Faktor ein. Gib Wiederherstellungscodes zurück, um sie zu zeigen, oder wirf einen Fehler, wenn der Code falsch ist. | (code: string) => Promise<void | string[]> | – |
onDisableTwoFactorSchaltet Zwei-Faktor aus. Läuft, nachdem die Person bestätigt hat. | () => Promise<void> | – |
passkeys{ id, name, createdAt, lastUsed? }. | SecurityPasskey[] | – |
onAddPasskeyFührt deine WebAuthn-Registrierung aus. Ein NotAllowedError oder AbortError gilt als abgebrochen und zeigt nichts. | () => Promise<void> | – |
onRemovePasskeyEntfernt einen Passkey. Läuft, nachdem die Person bestätigt hat. | (id: string) => Promise<void> | – |
passkeysSupportedÜberschreibt die Prüfung auf WebAuthn-Unterstützung. | boolean | detected |
onDeleteAccountLöscht das Konto. Läuft, nachdem die Person die Phrase getippt hat. Wirf einen Fehler, um den Dialog mit deiner Meldung offen zu halten. | () => Promise<void> | – |
deleteConsequencesWas gelöscht wird, in der Bestätigung aufgelistet. | ReactNode[] | – |
SecuritySessions
Akzeptiert auch alle SettingsGroup-Props.
| Prop | Typ | Standard |
|---|---|---|
sessionsDie angemeldeten Geräte. | SecuritySession[] | – |
onSignOutMeldet eine Sitzung ab. | (id: string) => Promise<void> | – |
onSignOutOthersMeldet jede andere Sitzung ab. | () => Promise<void> | – |
titleDie Gruppenüberschrift. | ReactNode | "Active sessions" |
| Prop | Typ | Standard |
|---|---|---|
emailWird in ein verborgenes Benutzernamenfeld eingetragen, damit Passwortmanager den richtigen Login aktualisieren. | string | – |
changedAtWann das Passwort zuletzt geändert wurde. | Date | string | number | null | – |
onChangePasswordWie bei SecuritySettings. | (change) => Promise<void | errors> | – |
| Prop | Typ | Standard |
|---|---|---|
emailIn der Bestätigung und der Datei mit den Wiederherstellungscodes genannt. | string | – |
enabledOb Zwei-Faktor aktiv ist. | boolean | – |
onStartWie bei onStartTwoFactor. | () => Promise<{ uri, secret?, recoveryCodes? }> | – |
onVerifyWie bei onVerifyTwoFactor. | (code: string) => Promise<void | string[]> | – |
onDisableWie bei onDisableTwoFactor. | () => Promise<void> | – |
SecurityPasskeys
Akzeptiert auch alle SettingsGroup-Props.
| Prop | Typ | Standard |
|---|---|---|
passkeysDie gespeicherten Passkeys. | SecurityPasskey[] | – |
onAddFührt deine WebAuthn-Registrierung aus. | () => Promise<void> | – |
onRemoveEntfernt einen Passkey. | (id: string) => Promise<void> | – |
supportedOb dieser Browser Passkeys erstellen kann. | boolean | detected |
SecurityDeleteAccount
Akzeptiert auch alle SettingsGroup-Props.
| Prop | Typ | Standard |
|---|---|---|
emailDie Bestätigungsphrase ist delete gefolgt von diesem Wert. | string | – |
onDeleteLöscht das Konto. | () => Promise<void> | – |
consequencesWas damit gelöscht wird. | ReactNode[] | – |
titleDie Gruppenüberschrift. | ReactNode | "Danger zone" |
| Taste | Aktion |
|---|---|
| Tab | Wechselt durch die Zeilen und ihre Buttons, dann durch jeden Dialog. |
| Enter | Sendet das Passwortformular aus jedem Feld ab und löscht das Konto aus dem Phrasenfeld, sobald es übereinstimmt. |
| Escape | Schließt einen Dialog, außer während etwas gespeichert wird. |
| 0–9 | Füllt den Bestätigungscode. Er prüft sich selbst, sobald alle sechs Ziffern drin sind, und auch das Einfügen eines Codes funktioniert. |
- Destruktive Aktionen erhalten nie zuerst den Fokus. Bestätigungen nennen, was sie betreffen, etwa die abzumeldenden Geräte oder die zu löschende E-Mail, und das Feld für die Löschphrase erhält den Fokus statt des Buttons.
- Wenn eine Zeile wegklappt, springt der Fokus zum Button der nächsten oder vorherigen Zeile, sodass er nie auf die Seite fällt. Das Schließen eines Dialogs gibt den Fokus an den Button zurück, der ihn geöffnet hat, oder an dessen Ersatz, wenn dieser Button weg ist.
- Abmeldungen, hinzugefügte und entfernte Passkeys und die Passwortstärke werden höflich angesagt. Fehler aus deinen Callbacks werden als Alerts angesagt und bleiben neben dem Feld oder Button, zu dem sie gehören.
- Jede Passwortanforderung sagt, ob sie erfüllt ist, der QR-Code hat ein Textlabel, und Einrichtungsschlüssel und Wiederherstellungscodes sind lesbarer, markierbarer Text.
- Bei reduzierter Bewegung blenden Zeilen aus, statt einzuklappen, und Schrittwechsel gleiten nicht. Im Hochkontrastmodus behalten QR-Code und Stärkeanzeige ihre Formen.
Gebaut mit
Die kostenlosen HextaUI-Komponenten, aus denen Security besteht. Jede lässt sich einzeln installieren.
Code
12 Dateien, hinzugefügt zu components/blocks/security.