mirror of
https://github.com/we-promise/sure.git
synced 2026-05-11 14:45:01 +00:00
feat(auth): add WebAuthn MFA credentials (#1628)
* feat(auth): add WebAuthn MFA credentials * fix(auth): harden WebAuthn MFA review paths * fix(auth): polish WebAuthn error handling * fix(auth): handle duplicate WebAuthn credential races * fix(auth): permit WebAuthn credential params * fix(auth): trim WebAuthn registration controller cleanup * fix(auth): tighten WebAuthn MFA handling * fix(auth): pin WebAuthn relying party config
This commit is contained in:
@@ -111,6 +111,17 @@ and change it to `true`
|
||||
RAILS_ASSUME_SSL: "true"
|
||||
```
|
||||
|
||||
#### WebAuthn MFA (passkeys and security keys)
|
||||
|
||||
If you enable passkeys, Touch ID, Windows Hello, or hardware security keys as MFA credentials, pin the WebAuthn relying party settings in your `.env` file:
|
||||
|
||||
```txt
|
||||
WEBAUTHN_RP_ID="example.com"
|
||||
WEBAUTHN_ALLOWED_ORIGINS="https://sure.example.com"
|
||||
```
|
||||
|
||||
`WEBAUTHN_RP_ID` should usually be your registrable domain, not a full URL. See [WebAuthn MFA Configuration](webauthn.md) before changing hostnames or reverse proxy settings for an instance with registered passkeys.
|
||||
|
||||
#### Binding to IPv6 (optional)
|
||||
|
||||
By default Sure listens on `0.0.0.0:3000` (IPv4 wildcard) inside the container and Docker publishes the port on the host's IPv4 interface only. If you want the app reachable over IPv6 as well, two things need to change:
|
||||
|
||||
27
docs/hosting/webauthn.md
Normal file
27
docs/hosting/webauthn.md
Normal file
@@ -0,0 +1,27 @@
|
||||
# WebAuthn MFA Configuration
|
||||
|
||||
Sure supports passkeys, Touch ID, Windows Hello, and hardware security keys as MFA credentials. WebAuthn credentials are bound to the relying party ID used when they are registered, so production deployments should pin these values explicitly instead of deriving them from incoming request headers.
|
||||
|
||||
Set these environment variables for self-hosted deployments:
|
||||
|
||||
```bash
|
||||
WEBAUTHN_RP_ID=example.com
|
||||
WEBAUTHN_ALLOWED_ORIGINS=https://sure.example.com
|
||||
```
|
||||
|
||||
`WEBAUTHN_RP_ID` is usually the registrable domain, such as `example.com`, not a full URL and not a hostname with a port. This lets credentials work across subdomains when the browser permits it.
|
||||
|
||||
`WEBAUTHN_ALLOWED_ORIGINS` is a comma-separated list of full origins where users access Sure, including scheme and host. Examples:
|
||||
|
||||
```bash
|
||||
WEBAUTHN_ALLOWED_ORIGINS=https://sure.example.com,https://app.example.com
|
||||
```
|
||||
|
||||
For local development, use:
|
||||
|
||||
```bash
|
||||
WEBAUTHN_RP_ID=localhost
|
||||
WEBAUTHN_ALLOWED_ORIGINS=http://localhost:3000
|
||||
```
|
||||
|
||||
Changing `WEBAUTHN_RP_ID` after users register credentials can make existing passkeys and security keys unavailable. Keep the value stable across reverse proxy, domain, and hostname changes.
|
||||
Reference in New Issue
Block a user