Forum OpenACS Development: Re: Preview: WebAuthn / Passkeys support for OpenACS (passwordless login)
WebAuthn / Passkeys in OpenACS – Clarifications on Standards, Vendors, and Implementation Choices
This post clarifies what is inherent to WebAuthn, what depends on platform vendors, and what is a deliberate design decision in the current OpenACS implementation. The goal is to avoid misattributing behavior to the wrong layer.
1. Inherent properties of WebAuthn (standard behavior)
These aspects are defined by the WebAuthn / FIDO2 standards and apply to all compliant implementations.
Relying Party ID (rpID)
- Credentials are strictly bound to an rpID
- The rpID is usually a domain name (e.g.
openacs.org) - Browsers enforce rpID matching; servers cannot override this
This means:
- Credentials created for
localhostare not usable foropenacs.org - Ports are not part of the rpID (but may appear in vendor UIs)
Credentials are asymmetric cryptographic keys
- A passkey is a private key held by the authenticator
- The server stores only the public key
- No shared secret is transmitted or stored
This is not configurable behavior — it is the core security model.
Multiple credentials per user are normal
- WebAuthn explicitly supports multiple credentials per user
- Each registration produces a distinct credential ID
- Servers must be prepared to manage lists of credentials
There is no “update passkey” operation in the standard — only create and delete.
Discoverable vs non-discoverable credentials
- Discoverable credentials (“resident keys”) allow passkey-first login
- Non-discoverable credentials require a prior user identifier
Whether discoverable credentials are used is a server choice, but their behavior is defined by the standard.
2. Vendor- and platform-specific behavior
These behaviors are outside the control of OpenACS and vary by OS and browser.
Passkey synchronization
- Apple: passkeys are synced via iCloud Keychain
- Google/Chrome: synced via Google Password Manager
- Firefox: often browser-local (depending on platform)
- Hardware keys: portable but not synced
As a result:
- A passkey created in one browser may appear in another
- The same credential may be usable across multiple browsers on the same device
UI labeling and grouping
- Platform UIs decide how passkeys are grouped and labeled
- Some systems merge historical entries (e.g. old
:8000sites) - Users may see only one entry even if multiple credentials exist server-side
This is a presentation artifact, not a protocol issue.
Browser password manager prompts
- Browsers strongly promote password managers
- Passkey prompts and password prompts may appear together
- Suppressing password UI is browser-specific and limited
This is not something WebAuthn or OpenACS can reliably control.
3. OpenACS implementation choices (preview phase)
The following points describe current design decisions, not protocol requirements.
Passkey-first login (current choice)
The implementation currently prefers passkey-first login using discoverable credentials.
Why:
- aligns with platform vendor guidance
- simpler UX for users with passkeys
- avoids an extra “enter email first” step
Alternative (not yet implemented):
- email/username-first login
- server-side filtering of credentials
- clearer for multi-account scenarios
This may become configurable.
When the passkey login button is shown
Currently shown only when:
- WebAuthn is supported by the browser
- the WebAuthn package is enabled
- there is a reasonable hint that a passkey may exist
This avoids confusing first-time users.
Session expiration behavior
In the preview:
- passkey logins do not silently re-authenticate
- session expiration triggers a logout
- reauthentication is explicit
This is a conservative choice for testing and may change.
Credential management UI
OpenACS:
- lists all credentials per user
- shows labels derived from User-Agent
- allows explicit deletion
Labeling is informational only and not security-relevant.
rpID configuration
OpenACS:
- derives the default rpID from the server configuration name
- allows explicit override via package parameter
- validates rpID at startup
This avoids accidental misconfiguration and makes the security boundary explicit.
Summary
| Layer | What it controls |
|---|---|
| WebAuthn standard | Cryptography, rpID binding, credential model |
| Platform vendors | Syncing, UI, password manager behavior |
| OpenACS | Login flow, UX choices, credential management, defaults |
Understanding these layers helps distinguish what can be tuned from what must be accepted as given.