diff --git a/README.md b/README.md index 56ff3ae..fce9a79 100644 --- a/README.md +++ b/README.md @@ -224,9 +224,15 @@ WebAuthn credential with required user verification. That device can then sign i and authorize high-impact actions with its biometric/PIN gesture. The access token remains the recovery fallback for browsers without WebAuthn or devices without an enrolled credential. Registration and authentication challenges are exact-purpose, -single-use, and short-lived. Remotely revoking an enrolled device deletes its passkey -as well as its active session; signing out normally keeps the passkey available for -the next sign-in. +single-use, and short-lived. **Enrolled passkeys** lists every durable credential, +including those whose original session has expired or signed out, using only its +bounded label, enrollment time, and active/current status. Removing one requires a +single-use fresh authorization bound to that exact management ID. A remote active +session linked to the credential is revoked atomically; unrelated credentials and +sessions remain valid. Removing the current device's passkey keeps its current +session active, so the sheet warns that the recovery token will be required after +sign-out. Remotely revoking an enrolled device also deletes its passkey; signing out +normally keeps the passkey available for the next sign-in. High-impact actions—merging a pull request, closing an assigned issue, revoking a remote device, or signing out every device—require a passkey assertion or the diff --git a/frontend/dashboard.css b/frontend/dashboard.css index 5612081..967182e 100644 --- a/frontend/dashboard.css +++ b/frontend/dashboard.css @@ -16,11 +16,16 @@ button { background: linear-gradient(180deg,#1f3a5f,#15324d); border:1px solid # .active-devices-panel { box-sizing:border-box; width:min(560px,100%); height:100%; overflow:auto; padding:18px; padding-bottom:calc(18px + env(safe-area-inset-bottom)); background:#0b1526; border-left:1px solid #2a496e; } .active-devices-header { display:flex; align-items:flex-start; justify-content:space-between; gap:12px; } .active-devices-header h2, .active-devices-header p { margin-top:0; } -.active-devices-header button, .active-device button { min-height:44px; } +.active-devices-header button, .active-device button, .enrolled-passkey button { min-height:44px; } .active-devices-list { display:grid; gap:10px; margin-top:16px; } .active-device { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; align-items:center; padding:12px; border:1px solid #2a496e; border-radius:12px; background:#0f2237; } .active-device strong, .active-device span { display:block; overflow-wrap:anywhere; } .active-device-current { color:#55d6be; font-weight:700; } +.enrolled-passkeys { margin-top:24px; padding-top:18px; border-top:1px solid #2a496e; } +.enrolled-passkeys-header h3, .enrolled-passkeys-header p { margin:0 0 6px; } +.enrolled-passkeys-list { display:grid; gap:10px; margin-top:12px; } +.enrolled-passkey { display:grid; grid-template-columns:minmax(0,1fr) auto; gap:8px; align-items:center; padding:12px; border:1px solid #2a496e; border-radius:12px; background:#0f2237; } +.enrolled-passkey strong, .enrolled-passkey span { display:block; overflow-wrap:anywhere; } .security-activity { margin-top:24px; padding-top:18px; border-top:1px solid #2a496e; } .security-activity-header h3, .security-activity-header p { margin:0 0 6px; } .security-activity-list { display:grid; gap:8px; margin:12px 0; } diff --git a/frontend/index.html b/frontend/index.html index b448e54..9a186f0 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -30,7 +30,7 @@
Review signed-in devices and remove access you no longer trust.
Passkeys can remain enrolled after a device signs out. Remove credentials you no longer trust.
+A recovery token will be required after sign-out if you remove this device’s passkey.
+