Groundwork only — no user-visible behavior. Everything else in the project builds on this.
Scope
Add @simplewebauthn/server (backend) and @simplewebauthn/browser (frontend)
Migration for credential storage: credential ID, public key, signature counter, transports, owning customer, created/last-used timestamps
Migration for in-flight challenges, which must be single-use and expiring
Relying Party configuration derived from the environment
Why RP configuration is the interesting part
The Relying Party ID is a domain, and a credential is bound to it permanently. That means:
Environment
RP ID
Consequence
Local
localhost
Works — http://localhost is a secure context
QA
qa-redefined-designs.bermudalamb.synology.me
Passkeys registered here work only here
Production
redefined-designs.bermudalamb.synology.me
Separate credentials again
So QA can prove the flow but never the credentials. This needs deriving from PUBLIC_URL, which every environment already sets, rather than being hardcoded.
Decisions to make
Signature counter handling: reject on a counter regression, or log and continue? (Some authenticators do not increment reliably.)
Challenge storage: a table, or reuse customer_tokens with a new kind?
Whether credentials survive an account being disabled (#33) or deleted
Part of the Passkeys project. Parent: #36.
Groundwork only — no user-visible behavior. Everything else in the project builds on this.
## Scope
- Add `@simplewebauthn/server` (backend) and `@simplewebauthn/browser` (frontend)
- Migration for credential storage: credential ID, public key, signature counter, transports, owning customer, created/last-used timestamps
- Migration for in-flight challenges, which must be single-use and expiring
- Relying Party configuration derived from the environment
## Why RP configuration is the interesting part
The Relying Party ID is a domain, and a credential is bound to it permanently. That means:
| Environment | RP ID | Consequence |
| --- | --- | --- |
| Local | `localhost` | Works — `http://localhost` is a secure context |
| QA | `qa-redefined-designs.bermudalamb.synology.me` | Passkeys registered here work only here |
| Production | `redefined-designs.bermudalamb.synology.me` | Separate credentials again |
So QA can prove the *flow* but never the *credentials*. This needs deriving from `PUBLIC_URL`, which every environment already sets, rather than being hardcoded.
## Decisions to make
- Signature counter handling: reject on a counter regression, or log and continue? (Some authenticators do not increment reliably.)
- Challenge storage: a table, or reuse `customer_tokens` with a new `kind`?
- Whether credentials survive an account being disabled (#33) or deleted
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Part of the Passkeys project. Parent: #36.
Groundwork only — no user-visible behavior. Everything else in the project builds on this.
Scope
@simplewebauthn/server(backend) and@simplewebauthn/browser(frontend)Why RP configuration is the interesting part
The Relying Party ID is a domain, and a credential is bound to it permanently. That means:
localhosthttp://localhostis a secure contextqa-redefined-designs.bermudalamb.synology.meredefined-designs.bermudalamb.synology.meSo QA can prove the flow but never the credentials. This needs deriving from
PUBLIC_URL, which every environment already sets, rather than being hardcoded.Decisions to make
customer_tokenswith a newkind?