Skip to main content

Passkeys (WebAuthn / FIDO2)

Monetro supports passwordless authentication using Passkeys — powered by the WebAuthn standard (FIDO2). Users can sign in with Touch ID, Face ID, Windows Hello, or hardware security keys like YubiKey.

Prerequisites

  • HTTPS connection (Passkeys do not work over HTTP)
  • Browser with WebAuthn support (Chrome 67+, Safari 14+, Firefox 60+)
  • Platform authenticator (Touch ID, Face ID, Windows Hello) or hardware key (YubiKey)

Register a Passkey

  1. Go to Settings > Security > Passkeys
  2. Enter an optional name (e.g., "MacBook Touch ID")
  3. Click "Add Passkey"
  4. Confirm the browser dialog (Touch ID / Face ID / PIN)

The passkey is now stored in your browser and on the Monetro server.

Sign In with Passkey

  1. Open the login page
  2. Click "Sign in with Passkey" (only visible if a passkey has been registered)
  3. Confirm the browser dialog

No password or 2FA code needed — the passkey is your full authentication.

Delete a Passkey

You must delete the passkey in both places:

  1. In Monetro: Settings > Security > click "Remove" next to the passkey entry
  2. In your browser/OS: macOS > System Preferences > Passwords > search "monetro" > delete
caution

Always delete in both places. A passkey that exists only in your browser (but not on the server) will fail silently on login.

API Endpoints

MethodEndpointDescription
GET/api/auth/passkey/register-optionsGet registration challenge
POST/api/auth/passkey/registerStore new passkey
POST/api/auth/passkey/authenticate-optionsGet login challenge
POST/api/auth/passkey/authenticateLogin with passkey (returns JWT)
GET/api/auth/passkey/listList all passkeys for current user
DELETE/api/auth/passkey/:idDelete a passkey

Troubleshooting

ErrorCauseSolution
"WebAuthn is not supported on sites with TLS certificate errors"Invalid or expired SSL certificateRenew certificate (Traefik / Let's Encrypt)
"Registration was cancelled or blocked by the browser"NotAllowedError from browserDon't cancel the browser dialog; ensure no other dialog is open
"Unknown Passkey" (PASSKEY_NOT_FOUND)Passkey exists in browser but not in databaseDelete the old passkey from your browser, register a new one
Backend returns 502 on passkey loginBackend container is downRedeploy backend in Dokploy
"expected https:// got http://"Trust proxy not configuredEnsure app.set('trust proxy', 1) is set in Express