Add device passkeys for sign-in and fresh authorization #485

Closed
opened 2026-08-10 12:49:20 +00:00 by timmy · 0 comments
Owner

Evidence

The dashboard currently requires the same reusable operator token for every sign-in and every high-impact fresh-authorization prompt. Active-device revocation, short-lived sessions, throttling, and exact action/target grants reduce exposure, but do not remove repeated handling of the shared bearer secret. Current origin/main has no WebAuthn/passkey implementation, and no historical issue or recent commit covers passkeys.

User impact

After one token bootstrap, an operator can enroll a device passkey, then use biometric/PIN verification for future sign-in and exact-action fresh authorization. The token remains an explicit recovery fallback. Revoking a device also removes its credential.

Acceptance criteria

  • Enroll a passkey only from an authenticated, freshly authorized session using a one-time expiring challenge bound to RP ID and expected origin.
  • Sign in with an enrolled passkey without submitting the shared access token and receive the existing secure session cookie.
  • Satisfy merge/close/device-revocation fresh authorization with a passkey assertion bound to exact action and target; reject wrong-target, expired, and replayed assertions.
  • Revoking a managed device removes its active sessions and enrolled credential; unrelated devices remain active.
  • Browsers without WebAuthn and operators without credentials retain the throttled token recovery path.
  • Responses remain no-store and credential/token material is not exposed in logs or errors.
  • Behavioral backend/frontend tests cover enrollment, sign-in, step-up, replay rejection, revocation, and fallback.
## Evidence The dashboard currently requires the same reusable operator token for every sign-in and every high-impact fresh-authorization prompt. Active-device revocation, short-lived sessions, throttling, and exact action/target grants reduce exposure, but do not remove repeated handling of the shared bearer secret. Current `origin/main` has no WebAuthn/passkey implementation, and no historical issue or recent commit covers passkeys. ## User impact After one token bootstrap, an operator can enroll a device passkey, then use biometric/PIN verification for future sign-in and exact-action fresh authorization. The token remains an explicit recovery fallback. Revoking a device also removes its credential. ## Acceptance criteria - Enroll a passkey only from an authenticated, freshly authorized session using a one-time expiring challenge bound to RP ID and expected origin. - Sign in with an enrolled passkey without submitting the shared access token and receive the existing secure session cookie. - Satisfy merge/close/device-revocation fresh authorization with a passkey assertion bound to exact action and target; reject wrong-target, expired, and replayed assertions. - Revoking a managed device removes its active sessions and enrolled credential; unrelated devices remain active. - Browsers without WebAuthn and operators without credentials retain the throttled token recovery path. - Responses remain no-store and credential/token material is not exposed in logs or errors. - Behavioral backend/frontend tests cover enrollment, sign-in, step-up, replay rejection, revocation, and fallback.
timmy self-assigned this 2026-08-10 12:49:20 +00:00
timmy closed this issue 2026-08-10 13:16:22 +00:00
Sign in to join this conversation.
No Milestone
No project
No Assignees
1 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: stackchain/stackchain-dashboard#485
No description provided.