Browser compatibility
The FIDO2 Web SDK is a browser-only library that requires specific browser capabilities to function. This page describes the browser features required for each capability, supported browsers, and how to verify compatibility in your application.
Browser requirements
The required browser APIs depend on which SDK capabilities you use:
| Capability | Browser features required | Minimum supported browsers |
|---|---|---|
| Platform passkeys | WebAuthn API | Chrome 67+, Firefox 60+, Safari 13+, Edge 79+ |
| Device-bound passkeys | WebAuthn API, Web Crypto API, IndexedDB | Chrome 67+, Firefox 60+, Safari 13+, Edge 79+ |
Compatibility checks
Use the following functions to verify browser support before enabling FIDO2 features in your application.
Check WebAuthn support (platform passkeys)
function isWebAuthnSupported() {
return !!window.PublicKeyCredential;
}
Check Device-Bound Passkey support
function isDeviceBoundPasskeySupported() {
return !!(
window.PublicKeyCredential &&
window.indexedDB &&
window.crypto &&
window.crypto.subtle
);
}
Example — Conditional feature enablement
if (isDeviceBoundPasskeySupported()) {
enableDeviceBoundPasskeys();
} else if (isWebAuthnSupported()) {
enablePlatformPasskeysOnly();
} else {
showFallbackAuthentication();
}
Secure context requirement
WebAuthn requires a secure context. This applies to all SDK operations, regardless of the browser. The SDK must be served from:
https://example.com— standard HTTPS (production)http://localhost— accepted for developmenthttp://127.0.0.1— accepted for developmenthttp://[::1]— IPv6 localhost, accepted for development
HTTP origins other than localhost are not accepted.
if (!window.isSecureContext) {
showError('HTTPS is required for FIDO2 authentication.');
}
Tested environments
The SDK is tested in the following browser environments:
| Browser | Environment | Status |
|---|---|---|
| Chromium (headless) | Playwright headless | Supported |
| Firefox (headless) | Headless with custom profile | Supported |
| WebKit (headless) | Playwright headless | Supported |
Browser-specific considerations
Chrome and Chromium
Supported versions: 67 and later
- Platform authenticators: Windows Hello, Touch ID on macOS
- Roaming authenticators: USB, NFC, Bluetooth security keys
- Conditional UI (autofill): supported
- Passkeys: supported
Recommended browser for development and testing.
Firefox
Supported versions: 60 and later
- Platform authenticators: supported
- Roaming authenticators: USB security keys
- Passkeys: supported from version 119
Security keys require a user gesture. Some advanced features may have delayed support compared to Chrome.
Safari
Supported versions: 13 and later
- Platform authenticators: Touch ID, Face ID
- Roaming authenticators: USB and NFC (iOS 16.3 and later)
- Passkeys and iCloud Keychain sync: supported from Safari 16
Safari 13–15 provides basic WebAuthn support. Safari 16 and later provides full passkey support.
Edge
Supported versions: 79 and later (Chromium-based)
- Platform authenticators: Windows Hello
- Roaming authenticators: supported
- Passkeys: supported from Chromium-based Edge 108
Edge 18 (EdgeHTML legacy) has limited support. Edge 79 and later (Chromium-based) provides full modern WebAuthn support.
Platform support
Desktop
| Platform | Supported versions | Authenticators |
|---|---|---|
| Windows 10 (1903+), Windows 11 | — | Windows Hello (face, fingerprint, PIN); security keys (USB, NFC, Bluetooth) |
| macOS 10.15 (Catalina) and later | — | Touch ID; security keys; iCloud Keychain sync (Safari 16+) |
| Linux (modern distributions) | — | Security keys (USB); platform authenticators limited by desktop environment |
Mobile
| Platform | Supported versions | Authenticators |
|---|---|---|
| iOS / iPadOS | 13 and later | Face ID / Touch ID; security keys (Lightning, USB-C, NFC on iOS 16.3+); passkeys with iCloud Keychain (iOS 16+) |
| Android | 7.0 and later | Fingerprint / face unlock; security keys (USB, NFC, Bluetooth); passkeys (Android 9+) |
Note
All browsers on iOS use Safari's WebKit engine. Chrome and Firefox on iOS behave the same as Safari for WebAuthn purposes.
Incognito and private browsing mode
IndexedDB works in incognito or private browsing mode during the session, with the following limitations:
Works normally:
- SDK initialization (
initSdk()) - Registration within the session
- Authentication within the same session
Limitations:
- IndexedDB data is cleared when the incognito session ends
- Device Bound Keys created in one incognito session are not available in subsequent sessions
- Each new incognito session generates a new HMAC seed, producing different
dbkKidvalues for the same user
Recommendations for production applications:
- Inform users that Device Bound Keys are session-specific in incognito mode
- Provide alternative authentication methods as a fallback
- Optionally display a warning when incognito mode is detected
Known limitations
- User gesture required: Most browsers require a user gesture (click or tap) before WebAuthn operations can be initiated.
- Concurrent operations: Only one WebAuthn operation can run at a time per browser window.
- Maximum timeout: The maximum operation timeout is typically 5 minutes (300,000 ms).
- Safari conditional UI: Autofill-assisted authentication has limited support — use explicit button-based authentication as a fallback.
- Firefox Bluetooth: Some Bluetooth security keys may not work on Firefox. USB security keys are recommended.
- Cross-device authentication: Requires iOS 16 or Android 9 and later.
Related documentation
- Getting started: Installation and setup
- Troubleshooting: Common issues and solutions