Passkey Implementation
Passwordless sign-in for customers using WebAuthn passkeys, alongside the existing email and password login.
Split out of #31 because it is the only item there that introduces a second authentication path next to the current bcrypt + rd_session cookie. Tracking issue: #36.
Issues
| # | Scope | Depends on |
|---|---|---|
| #37 | Schema, @simplewebauthn dependency, per-environment RP config |
— |
| #38 | Registration ceremony — a signed-in customer enrolls a passkey | #37 |
| #40 | Manage and revoke passkeys from the account page | #38 |
| #39 | Authentication ceremony — signing in with a passkey | #38 |
| #41 | Login page integration, feature detection, fallback | #39 |
| #42 | Account recovery and password-reset interaction | #32, #39 |
Suggested order: #37 → #38 → #40 → #39 → #41 → #42
#40 comes before #39 on purpose. Once a customer can enroll a passkey they can also strand one, and shipping enrollment with no way to see or remove a credential is worse than not offering passkeys at all.
Standing constraints
- The Relying Party ID is domain-bound. A passkey registered against QA will never work in production. QA proves the flow, the fallbacks, and the copy — never the credentials. Production needs its own smoke test after deploy.
- Password login remains the fallback throughout. Nothing here should make it possible to end up with an account that cannot be recovered.
- A disabled account (#33) must not authenticate via passkey. Enforcing that only on the password path would leave passkeys as a way around it.
Depends on
- #32 — password reset. Passkey login cannot ship without account recovery; a customer who loses their authenticator needs a way back in.
- #33 — disable account, so the "cannot authenticate" rule exists before there is a second path that has to honor it.
Done when
A customer can enroll a passkey, sign in with it, see and revoke it, fall back to a password on any device that does not support it, and recover the account if the authenticator is lost.
0
To Do
0
Send Back
0
In Progress
0
Ready For Review
0
In Review
0
Ready for QA
0
In QA
0
Ready for Release
0
Released