{"_id":"@capawesome/capacitor-passkeys","_rev":"4-4ec2f8e2ce3033813a00cf2e4b03681f","name":"@capawesome/capacitor-passkeys","dist-tags":{"latest":"0.1.2"},"versions":{"0.0.1":{"name":"@capawesome/capacitor-passkeys","version":"0.0.1","keywords":["capacitor","plugin","native"],"author":{"name":"Robin Genz","email":"mail@robingenz.dev"},"license":"MIT","_id":"@capawesome/capacitor-passkeys@0.0.1","maintainers":[{"name":"robingenz","email":"mail@robingenz.dev"}],"homepage":"https://capawesome.io/docs/plugins/passkeys/","bugs":{"url":"https://github.com/capawesome-team/capacitor-plugins/issues"},"dist":{"shasum":"6d3486d079cb8a3fba50395e51a8049dbff1b59f","tarball":"https://registry.npmjs.org/@capawesome/capacitor-passkeys/-/capacitor-passkeys-0.0.1.tgz","fileCount":45,"integrity":"sha512-xTdDfctxRqGjO5f9qLzpnbMQiEtj/lUAPilRUnweT+BNG68k8BglBKkLtFpaRtr9wKwnzz2SeKyhxj9eeu46rg==","signatures":[{"sig":"MEUCIQDC4R9VTqJaAw8yPrRp9Mgw7NTHfKCD8RLJe0u8C+b/5gIgQA2GloeY7nweTu/sgFnM4CRLx66nrBiVvBIivkHO1DA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":208648},"main":"dist/plugin.cjs.js","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","module":"dist/esm/index.js","funding":[{"url":"https://github.com/sponsors/capawesome-team/","type":"github"},{"url":"https://opencollective.com/capawesome","type":"opencollective"}],"gitHead":"8dd31ce5d3f16f94fb71d033f47512e99908f4e4","scripts":{"fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","build":"npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","docgen":"docgen --api PasskeysPlugin --output-readme README.md --output-json dist/docs.json","eslint":"eslint . --ext ts","verify":"npm run verify:ios && npm run verify:android && npm run verify:web","prettier":"prettier \"**/*.{css,html,ts,js,java}\"","swiftlint":"node-swiftlint","verify:ios":"cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin -destination generic/platform=iOS && cd ..","verify:web":"npm run build","prepublishOnly":"npm run build","verify:android":"cd android && ./gradlew clean build test && cd ..","ios:pod:install":"cd ios && pod install --repo-update && cd ..","ios:spm:install":"cd ios && swift package resolve && cd .."},"_npmUser":{"name":"robingenz","email":"mail@robingenz.dev"},"capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"repository":{"url":"git+https://github.com/capawesome-team/capacitor-plugins.git","type":"git"},"_npmVersion":"11.13.0","description":"Capacitor plugin to create and authenticate with passkeys (WebAuthn).","directories":{},"_nodeVersion":"24.16.0","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"8.57.0","rimraf":"6.1.2","rollup":"4.53.3","swiftlint":"2.0.0","typescript":"5.9.3","@capacitor/cli":"8.0.0","@capacitor/ios":"8.0.0","@capacitor/core":"8.0.0","@capacitor/docgen":"0.3.1","@capacitor/android":"8.0.0","@ionic/eslint-config":"0.4.0","prettier-plugin-java":"2.6.7"},"peerDependencies":{"@capacitor/core":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/capacitor-passkeys_0.0.1_1783405296858_0.7127930643892686","host":"s3://npm-registry-packages-npm-production"}},"0.1.0":{"name":"@capawesome/capacitor-passkeys","version":"0.1.0","keywords":["capacitor","plugin","native","capacitor-plugin","passkeys","passkey","webauthn","fido2","passwordless","authentication","credential manager"],"author":{"name":"Robin Genz","email":"mail@robingenz.dev"},"license":"MIT","_id":"@capawesome/capacitor-passkeys@0.1.0","maintainers":[{"name":"robingenz","email":"mail@robingenz.dev"}],"homepage":"https://capawesome.io/docs/sdks/capacitor/passkeys/","bugs":{"url":"https://github.com/capawesome-team/capacitor-plugins/issues"},"dist":{"shasum":"246879e57b1e12711b97c113328c9acd45b98cb9","tarball":"https://registry.npmjs.org/@capawesome/capacitor-passkeys/-/capacitor-passkeys-0.1.0.tgz","fileCount":45,"integrity":"sha512-jSlr3AighT/AP/2ahIkCM6Q42PlXtcNM1Dq0gjYresWvN7Uq1MSTKZK5IgqhAuyY4jDRlz5gSRtsFBbsDzPlow==","signatures":[{"sig":"MEYCIQD6maiXZsgUPO9nhM5dD130laCdjECPSkbyJixlYpWIcgIhALOcWrqaoGscab+XjydYqK2PlvIFWV0YgWjbYxq45gOv","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@capawesome%2fcapacitor-passkeys@0.1.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":214350},"main":"dist/plugin.cjs.js","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","module":"dist/esm/index.js","funding":[{"url":"https://github.com/sponsors/capawesome-team/","type":"github"},{"url":"https://opencollective.com/capawesome","type":"opencollective"}],"gitHead":"1ce17b1fd14c43b2f1d5d3c2da82221e1d1dca37","scripts":{"fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","build":"npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","docgen":"docgen --api PasskeysPlugin --output-readme README.md --output-json dist/docs.json","eslint":"eslint . --ext ts","verify":"npm run verify:ios && npm run verify:android && npm run verify:web","prettier":"prettier \"**/*.{css,html,ts,js,java}\"","swiftlint":"node-swiftlint","verify:ios":"cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin -destination generic/platform=iOS && cd ..","verify:web":"npm run build","prepublishOnly":"npm run build","verify:android":"cd android && ./gradlew clean build test && cd ..","ios:pod:install":"cd ios && pod install --repo-update && cd ..","ios:spm:install":"cd ios && swift package resolve && cd .."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8c415ab7-f1e3-4901-87c2-78e95324b1c7"}},"capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"repository":{"url":"git+https://github.com/capawesome-team/capacitor-plugins.git","type":"git"},"_npmVersion":"11.16.0","description":"Capacitor plugin to create and authenticate with passkeys (WebAuthn) on Android, iOS, and Web.","directories":{},"_nodeVersion":"24.18.0","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"8.57.0","rimraf":"6.1.2","rollup":"4.53.3","swiftlint":"2.0.0","typescript":"5.9.3","@capacitor/cli":"8.0.0","@capacitor/ios":"8.0.0","@capacitor/core":"8.0.0","@capacitor/docgen":"0.3.1","@capacitor/android":"8.0.0","@ionic/eslint-config":"0.4.0","prettier-plugin-java":"2.6.7"},"peerDependencies":{"@capacitor/core":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/capacitor-passkeys_0.1.0_1784015568085_0.10513384120786684","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@capawesome/capacitor-passkeys","version":"0.1.1","keywords":["capacitor","plugin","native","capacitor-plugin","passkeys","passkey","webauthn","fido2","passwordless","authentication","credential manager"],"author":{"name":"Robin Genz","email":"mail@robingenz.dev"},"license":"MIT","_id":"@capawesome/capacitor-passkeys@0.1.1","maintainers":[{"name":"robingenz","email":"mail@robingenz.dev"}],"homepage":"https://capawesome.io/docs/sdks/capacitor/passkeys/","bugs":{"url":"https://github.com/capawesome-team/capacitor-plugins/issues"},"dist":{"shasum":"7c7434431e47e5594e9ea84d447a08be4a7e45ea","tarball":"https://registry.npmjs.org/@capawesome/capacitor-passkeys/-/capacitor-passkeys-0.1.1.tgz","fileCount":45,"integrity":"sha512-ZebJ/yp1PHlSr02RIZgaPJX3eTok9J+WJHpX44ijG4C12MZlu8QLA3Zzl7XgP8sLAMMZ/sxzchUTPPXJaMrnAw==","signatures":[{"sig":"MEUCIDGfs9kclR1Y/Ofdp3uCtTtZy6FVB7xkD3OLP4xXdl4rAiEA6e7RDldI8c66hgch12xnjc6ssitBA+r6zzNoB7xM0g8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@capawesome%2fcapacitor-passkeys@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":214359},"main":"dist/plugin.cjs.js","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","module":"dist/esm/index.js","funding":[{"url":"https://github.com/sponsors/capawesome-team/","type":"github"},{"url":"https://opencollective.com/capawesome","type":"opencollective"}],"gitHead":"3e61f4b412f9f3f512c21169bb135bbb23a67e6d","scripts":{"fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","build":"npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","docgen":"docgen --api PasskeysPlugin --output-readme README.md --output-json dist/docs.json","eslint":"eslint . --ext ts","verify":"npm run verify:ios && npm run verify:android && npm run verify:web","prettier":"prettier \"**/*.{css,html,ts,js,java}\"","swiftlint":"node-swiftlint","verify:ios":"cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin -destination generic/platform=iOS && cd ..","verify:web":"npm run build","prepublishOnly":"npm run build","verify:android":"cd android && ./gradlew clean build test && cd ..","ios:pod:install":"cd ios && pod install --repo-update && cd ..","ios:spm:install":"cd ios && swift package resolve && cd .."},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8c415ab7-f1e3-4901-87c2-78e95324b1c7"}},"capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"repository":{"url":"git+https://github.com/capawesome-team/capacitor-plugins.git","type":"git"},"_npmVersion":"11.16.0","description":"Capacitor plugin to create and authenticate with passkeys (WebAuthn) on Android, iOS, and Web.","directories":{},"_nodeVersion":"24.18.0","eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"8.57.0","rimraf":"6.1.2","rollup":"4.53.3","swiftlint":"2.0.0","typescript":"5.9.3","@capacitor/cli":"8.0.0","@capacitor/ios":"8.0.0","@capacitor/core":"8.0.0","@capacitor/docgen":"0.3.1","@capacitor/android":"8.0.0","@ionic/eslint-config":"0.4.0","prettier-plugin-java":"2.6.7"},"peerDependencies":{"@capacitor/core":">=8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/capacitor-passkeys_0.1.1_1784103018499_0.07234886944102525","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@capawesome/capacitor-passkeys","version":"0.1.2","description":"Capacitor plugin to create and authenticate with passkeys (WebAuthn) on Android, iOS, and Web.","main":"dist/plugin.cjs.js","module":"dist/esm/index.js","types":"dist/esm/index.d.ts","unpkg":"dist/plugin.js","author":{"name":"Robin Genz","email":"mail@robingenz.dev"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/capawesome-team/capacitor-plugins.git"},"bugs":{"url":"https://github.com/capawesome-team/capacitor-plugins/issues"},"funding":[{"type":"github","url":"https://github.com/sponsors/capawesome-team/"},{"type":"opencollective","url":"https://opencollective.com/capawesome"}],"homepage":"https://capawesome.io/docs/sdks/capacitor/passkeys/","keywords":["capacitor","plugin","native","capacitor-plugin","passkeys","passkey","webauthn","fido2","passwordless","authentication","credential manager"],"scripts":{"verify":"npm run verify:ios && npm run verify:android && npm run verify:web","verify:ios":"cd ios && pod install && xcodebuild -workspace Plugin.xcworkspace -scheme Plugin -destination generic/platform=iOS && cd ..","verify:android":"cd android && ./gradlew clean build test && cd ..","verify:web":"npm run build","lint":"npm run eslint && npm run prettier -- --check && npm run swiftlint -- lint","fmt":"npm run eslint -- --fix && npm run prettier -- --write && npm run swiftlint -- --fix --format","eslint":"eslint . --ext ts","prettier":"prettier \"**/*.{css,html,ts,js,java}\"","swiftlint":"node-swiftlint","docgen":"docgen --api PasskeysPlugin --output-readme README.md --output-json dist/docs.json","build":"npm run clean && npm run docgen && tsc && rollup -c rollup.config.mjs","clean":"rimraf ./dist","watch":"tsc --watch","ios:pod:install":"cd ios && pod install --repo-update && cd ..","ios:spm:install":"cd ios && swift package resolve && cd ..","prepublishOnly":"npm run build"},"devDependencies":{"@capacitor/android":"8.0.0","@capacitor/cli":"8.4.2","@capacitor/core":"8.0.0","@capacitor/docgen":"0.3.1","@capacitor/ios":"8.0.0","@ionic/eslint-config":"0.4.0","eslint":"8.57.0","prettier-plugin-java":"2.9.7","rimraf":"6.1.2","rollup":"4.62.3","swiftlint":"2.0.0","typescript":"5.9.3"},"peerDependencies":{"@capacitor/core":">=8.0.0"},"eslintConfig":{"extends":"@ionic/eslint-config/recommended"},"capacitor":{"ios":{"src":"ios"},"android":{"src":"android"}},"publishConfig":{"access":"public"},"gitHead":"7c1937ed10b7de86ca2c1cdc3539a2735fd69a00","_id":"@capawesome/capacitor-passkeys@0.1.2","_nodeVersion":"24.19.0","_npmVersion":"11.17.0","dist":{"integrity":"sha512-egaDs8M1XjYKG0tmc2brmpnQTCdnlq9NxA6dOMtS4cJY9viYkGPSdt8heaswey5uv8bYo3cxKeQcCZknypG5Hw==","shasum":"afb6355f1db24200ca0f8f0200d1668febbe36af","tarball":"https://registry.npmjs.org/@capawesome/capacitor-passkeys/-/capacitor-passkeys-0.1.2.tgz","fileCount":45,"unpackedSize":214213,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@capawesome%2fcapacitor-passkeys@0.1.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIEqNdcEDXLOpXOa02IW/LAs0oyp8pnWfxBOspSP2O2oiAiEAoreTEZM7sawJEV+mXCuDaTcM0K71ytUeEnKljI70VDc="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:8c415ab7-f1e3-4901-87c2-78e95324b1c7"}},"directories":{},"maintainers":[{"name":"robingenz","email":"mail@robingenz.dev"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/capacitor-passkeys_0.1.2_1788337381312_0.07396840689268602"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-07T06:21:36.679Z","modified":"2026-09-02T08:23:01.838Z","0.0.1":"2026-07-07T06:21:37.006Z","0.1.0":"2026-07-14T07:52:48.232Z","0.1.1":"2026-07-15T08:10:18.656Z","0.1.2":"2026-09-02T08:23:01.444Z"},"bugs":{"url":"https://github.com/capawesome-team/capacitor-plugins/issues"},"author":{"name":"Robin Genz","email":"mail@robingenz.dev"},"license":"MIT","homepage":"https://capawesome.io/docs/sdks/capacitor/passkeys/","keywords":["capacitor","plugin","native","capacitor-plugin","passkeys","passkey","webauthn","fido2","passwordless","authentication","credential manager"],"repository":{"type":"git","url":"git+https://github.com/capawesome-team/capacitor-plugins.git"},"description":"Capacitor plugin to create and authenticate with passkeys (WebAuthn) on Android, iOS, and Web.","maintainers":[{"name":"robingenz","email":"mail@robingenz.dev"}],"readme":"# Capacitor Passkeys Plugin\n\nCapacitor plugin to create and authenticate with [passkeys](https://fidoalliance.org/passkeys/) based on the [WebAuthn](https://www.w3.org/TR/webauthn-2/) standard.\n\n<div class=\"capawesome-z29o10a\">\n  <a href=\"https://cloud.capawesome.io/\" target=\"_blank\">\n    <img alt=\"Deliver Live Updates to your Capacitor app with Capawesome Cloud\" src=\"https://cloud.capawesome.io/assets/banners/cloud-build-and-deploy-capacitor-apps.png?t=1\" />\n  </a>\n</div>\n\n## Features\n\nThe Capacitor Passkeys plugin is one of the most complete passkey authentication solutions for Capacitor apps. Here are some of the key features:\n\n- 🔐 **Passkey creation**: Register new passkeys with the platform authenticator.\n- 🔑 **Passkey authentication**: Authenticate users with their existing passkeys.\n- 🌐 **WebAuthn standard**: Uses the WebAuthn JSON serialization so any WebAuthn server library works unchanged.\n- 📱 **Availability check**: Check if passkeys are available on the device.\n- 🖥️ **Web support**: Full web support via the native WebAuthn browser API.\n- 🤝 **Compatibility**: Works alongside the [Biometrics](https://capawesome.io/docs/sdks/capacitor/biometrics/) and [OAuth](https://capawesome.io/docs/sdks/capacitor/oauth/) plugins.\n- 📦 **CocoaPods & SPM**: Supports CocoaPods and Swift Package Manager for iOS.\n- 🔁 **Up-to-date**: Always supports the latest Capacitor version.\n\nMissing a feature? Just [open an issue](https://github.com/capawesome-team/capacitor-plugins/issues) and we'll take a look!\n\n## Use Cases\n\nThe Passkeys plugin is typically used to modernize the authentication of an app, for example:\n\n- **Passwordless sign-in**: Let users authenticate with a passkey instead of typing a password.\n- **Passkey enrollment**: Let existing users register a passkey for their account after they signed in with their current credentials.\n- **Progressive enhancement**: Check with `isAvailable()` whether passkeys are supported on the device and offer them as an alternative to your existing login.\n- **Server integration**: Pass the options and results of any WebAuthn server library through unchanged, thanks to the WebAuthn JSON serialization.\n\n## Compatibility\n\n| Plugin Version | Capacitor Version | Status         |\n| -------------- | ----------------- | -------------- |\n| 0.x.x          | >=8.x.x           | Active support |\n\n## Installation\n\nYou can use our **AI-Assisted Setup** to install the plugin.\nAdd the [Capawesome Skills](https://github.com/capawesome-team/skills) to your AI tool using the following command:\n\n```bash\nnpx skills add capawesome-team/skills --skill capacitor-plugins\n```\n\nThen use the following prompt:\n\n```\n Use the `capacitor-plugins` skill from `capawesome-team/skills` to install the `@capawesome/capacitor-passkeys` plugin in my project.\n```\n\nIf you prefer **Manual Setup**, install the plugin by running the following commands and follow the platform-specific instructions below:\n\n```bash\nnpm install @capawesome/capacitor-passkeys\nnpx cap sync\n```\n\n### Android\n\nOn Android, passkeys are supported on Android 9 (API level 28) and higher with an available credential provider (e.g. Google Password Manager).\n\n#### Variables\n\nThis plugin will use the following project variables (defined in your app’s `variables.gradle` file):\n\n- `$androidxCredentialsVersion` version of `androidx.credentials:credentials` and `androidx.credentials:credentials-play-services-auth` (default: `1.5.0`)\n\n#### Digital Asset Links\n\nYour app must be associated with the domain of the relying party (`rp.id` / `rpId`) using [Digital Asset Links](https://developers.google.com/digital-asset-links). For this, host a JSON file at `https://<your-domain>/.well-known/assetlinks.json` that delegates the `common.get_login_creds` permission to your app:\n\n```json\n[\n  {\n    \"relation\": [\n      \"delegate_permission/common.handle_all_urls\",\n      \"delegate_permission/common.get_login_creds\"\n    ],\n    \"target\": {\n      \"namespace\": \"android_app\",\n      \"package_name\": \"com.example.app\",\n      \"sha256_cert_fingerprints\": [\n        \"01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF:01:23:45:67:89:AB:CD:EF\"\n      ]\n    }\n  }\n]\n```\n\nReplace `com.example.app` with the application ID of your app and the fingerprint with the SHA-256 fingerprint of your app's signing certificate. Otherwise, the plugin methods will reject with the `DOMAIN_NOT_ASSOCIATED` error code.\n\n### iOS\n\nOn iOS, passkeys are supported on iOS 15 and higher.\n\n#### Associated Domains\n\nYour app must be associated with the domain of the relying party (`rp.id` / `rpId`). For this, add the [Associated Domains](https://developer.apple.com/documentation/xcode/supporting-associated-domains) capability with the `webcredentials` service type to your app:\n\n```xml\n<key>com.apple.developer.associated-domains</key>\n<array>\n  <string>webcredentials:example.com</string>\n</array>\n```\n\nAdditionally, host an [`apple-app-site-association`](https://developer.apple.com/documentation/xcode/supporting-associated-domains) file at `https://<your-domain>/.well-known/apple-app-site-association`:\n\n```json\n{\n  \"webcredentials\": {\n    \"apps\": [\"TEAMID.com.example.app\"]\n  }\n}\n```\n\nReplace `TEAMID` with your Apple Developer Team ID and `com.example.app` with the bundle identifier of your app. Otherwise, the plugin methods will reject with the `DOMAIN_NOT_ASSOCIATED` error code.\n\n## Configuration\n\nNo configuration required for this plugin.\n\n## Usage\n\nThe following examples show how to create a new passkey, authenticate with an existing passkey, and check whether passkeys are available on the device.\n\n### Create a new passkey\n\nRegister a new passkey for a user account. In a real app, the options must be provided by your WebAuthn server, and the result must be passed back to it for verification:\n\n```typescript\nimport { Passkeys } from '@capawesome/capacitor-passkeys';\n\nconst createPasskey = async () => {\n  // In a real app, the options must be provided by your WebAuthn server,\n  // e.g. via `generateRegistrationOptions()` from SimpleWebAuthn.\n  const result = await Passkeys.createPasskey({\n    attestation: 'none',\n    authenticatorSelection: {\n      residentKey: 'required',\n      userVerification: 'required',\n    },\n    challenge: 'dGhpc2lzYWNoYWxsZW5nZQ',\n    pubKeyCredParams: [\n      { alg: -7, type: 'public-key' },\n      { alg: -257, type: 'public-key' },\n    ],\n    rp: { id: 'example.com', name: 'Example Inc.' },\n    user: {\n      displayName: 'Jane Doe',\n      id: 'anVzdGFyYW5kb21pZA',\n      name: 'jane.doe@example.com',\n    },\n  });\n  // Pass the result to your WebAuthn server for verification,\n  // e.g. via `verifyRegistrationResponse()` from SimpleWebAuthn.\n  return result;\n};\n```\n\n### Authenticate with an existing passkey\n\nSign a user in with a passkey that was previously created for your relying party. Again, the options come from your WebAuthn server and the result is verified by it:\n\n```typescript\nimport { Passkeys } from '@capawesome/capacitor-passkeys';\n\nconst getPasskey = async () => {\n  // In a real app, the options must be provided by your WebAuthn server,\n  // e.g. via `generateAuthenticationOptions()` from SimpleWebAuthn.\n  const result = await Passkeys.getPasskey({\n    challenge: 'dGhpc2lzYWNoYWxsZW5nZQ',\n    rpId: 'example.com',\n    userVerification: 'required',\n  });\n  // Pass the result to your WebAuthn server for verification,\n  // e.g. via `verifyAuthenticationResponse()` from SimpleWebAuthn.\n  return result;\n};\n```\n\n### Check if passkeys are available\n\nCheck whether passkeys are available on the device before offering them in your login UI. On Android, this returns `true` if the device runs Android 9 (API level 28) or higher. On iOS, this always returns `true`. On Web, this returns `true` if the browser supports WebAuthn and a user-verifying platform authenticator is available:\n\n```typescript\nimport { Passkeys } from '@capawesome/capacitor-passkeys';\n\nconst isAvailable = async () => {\n  const { available } = await Passkeys.isAvailable();\n  return available;\n};\n```\n\n## API\n\n<docgen-index>\n\n* [`createPasskey(...)`](#createpasskey)\n* [`getPasskey(...)`](#getpasskey)\n* [`isAvailable()`](#isavailable)\n* [Interfaces](#interfaces)\n* [Type Aliases](#type-aliases)\n\n</docgen-index>\n\n<docgen-api>\n<!--Update the source file JSDoc comments and rerun docgen to update the docs below-->\n\n### createPasskey(...)\n\n```typescript\ncreatePasskey(options: CreatePasskeyOptions) => Promise<CreatePasskeyResult>\n```\n\nCreate (register) a new passkey.\n\nThe options mirror the WebAuthn `PublicKeyCredentialCreationOptions` JSON\nserialization so that the values provided by any WebAuthn server library\ncan be passed through unchanged.\n\n| Param         | Type                                                                  |\n| ------------- | --------------------------------------------------------------------- |\n| **`options`** | <code><a href=\"#createpasskeyoptions\">CreatePasskeyOptions</a></code> |\n\n**Returns:** <code>Promise&lt;<a href=\"#createpasskeyresult\">CreatePasskeyResult</a>&gt;</code>\n\n**Since:** 0.1.0\n\n--------------------\n\n\n### getPasskey(...)\n\n```typescript\ngetPasskey(options: GetPasskeyOptions) => Promise<GetPasskeyResult>\n```\n\nGet (authenticate with) an existing passkey.\n\nThe options mirror the WebAuthn `PublicKeyCredentialRequestOptions` JSON\nserialization so that the values provided by any WebAuthn server library\ncan be passed through unchanged.\n\n| Param         | Type                                                            |\n| ------------- | --------------------------------------------------------------- |\n| **`options`** | <code><a href=\"#getpasskeyoptions\">GetPasskeyOptions</a></code> |\n\n**Returns:** <code>Promise&lt;<a href=\"#getpasskeyresult\">GetPasskeyResult</a>&gt;</code>\n\n**Since:** 0.1.0\n\n--------------------\n\n\n### isAvailable()\n\n```typescript\nisAvailable() => Promise<IsAvailableResult>\n```\n\nCheck if passkeys are available on this device.\n\nOn **Android**, this returns `true` if the device runs Android 9 (API level 28) or higher.\nOn **iOS**, this always returns `true`.\nOn **Web**, this returns `true` if the browser supports WebAuthn and\na user-verifying platform authenticator is available.\n\n**Returns:** <code>Promise&lt;<a href=\"#isavailableresult\">IsAvailableResult</a>&gt;</code>\n\n**Since:** 0.1.0\n\n--------------------\n\n\n### Interfaces\n\n\n#### CreatePasskeyResult\n\nThe result of the passkey creation.\n\nThis mirrors the WebAuthn `RegistrationResponseJSON` so it can be\npassed to any WebAuthn server library for verification.\n\n| Prop                          | Type                                                                                      | Description                                                   | Since |\n| ----------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------- | ----- |\n| **`authenticatorAttachment`** | <code><a href=\"#passkeyauthenticatorattachment\">PasskeyAuthenticatorAttachment</a></code> | The attachment of the authenticator that created the passkey. | 0.1.0 |\n| **`id`**                      | <code>string</code>                                                                       | The credential identifier as a base64url-encoded string.      | 0.1.0 |\n| **`rawId`**                   | <code>string</code>                                                                       | The raw credential identifier as a base64url-encoded string.  | 0.1.0 |\n| **`response`**                | <code><a href=\"#createpasskeyresponse\">CreatePasskeyResponse</a></code>                   | The response of the authenticator.                            | 0.1.0 |\n| **`type`**                    | <code>'public-key'</code>                                                                 | The credential type.                                          | 0.1.0 |\n\n\n#### CreatePasskeyResponse\n\nThe response of the authenticator for the registration of a new passkey.\n\nThis mirrors the WebAuthn `AuthenticatorAttestationResponse` JSON\nserialization.\n\n| Prop                     | Type                            | Description                                                                                  | Since |\n| ------------------------ | ------------------------------- | -------------------------------------------------------------------------------------------- | ----- |\n| **`attestationObject`**  | <code>string</code>             | The attestation object as a base64url-encoded string.                                        | 0.1.0 |\n| **`authenticatorData`**  | <code>string</code>             | The authenticator data as a base64url-encoded string. Only available on Android and Web.     | 0.1.0 |\n| **`clientDataJSON`**     | <code>string</code>             | The client data as a base64url-encoded string.                                               | 0.1.0 |\n| **`publicKey`**          | <code>string</code>             | The DER-encoded public key as a base64url-encoded string. Only available on Android and Web. | 0.1.0 |\n| **`publicKeyAlgorithm`** | <code>number</code>             | The COSE algorithm identifier of the public key. Only available on Android and Web.          | 0.1.0 |\n| **`transports`**         | <code>PasskeyTransport[]</code> | The transports that the authenticator supports. Only available on Android and Web.           | 0.1.0 |\n\n\n#### CreatePasskeyOptions\n\n| Prop                         | Type                                                                                    | Description                                                                                                                                                                                  | Default             | Since |\n| ---------------------------- | --------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------- | ----- |\n| **`attestation`**            | <code><a href=\"#passkeyattestation\">PasskeyAttestation</a></code>                       | The attestation conveyance preference.                                                                                                                                                       | <code>'none'</code> | 0.1.0 |\n| **`authenticatorSelection`** | <code><a href=\"#passkeyauthenticatorselection\">PasskeyAuthenticatorSelection</a></code> | Criteria that the authenticator must meet.                                                                                                                                                   |                     | 0.1.0 |\n| **`challenge`**              | <code>string</code>                                                                     | The challenge provided by the relying party server as a base64url-encoded string.                                                                                                            |                     | 0.1.0 |\n| **`excludeCredentials`**     | <code>PasskeyCredentialDescriptor[]</code>                                              | Credentials that already exist for the user, so that the authenticator does not create a second passkey for the same account. On **iOS**, this option is only applied on iOS 17.4 and later. |                     | 0.1.0 |\n| **`pubKeyCredParams`**       | <code>PasskeyCredentialParameter[]</code>                                               | The public key credential types and algorithms that the relying party server supports, ordered from most to least preferred. Only available on Android and Web.                              |                     | 0.1.0 |\n| **`rp`**                     | <code><a href=\"#passkeyrelyingparty\">PasskeyRelyingParty</a></code>                     | The relying party for which the passkey is created.                                                                                                                                          |                     | 0.1.0 |\n| **`timeout`**                | <code>number</code>                                                                     | The time in milliseconds that the caller is willing to wait for the operation to complete. Only available on Android and Web.                                                                |                     | 0.1.0 |\n| **`user`**                   | <code><a href=\"#passkeyuser\">PasskeyUser</a></code>                                     | The user account for which the passkey is created.                                                                                                                                           |                     | 0.1.0 |\n\n\n#### PasskeyAuthenticatorSelection\n\nCriteria that the authenticator must meet to create a passkey.\n\n| Prop                          | Type                                                                                      | Description                                                                                                                                                                                           | Default                  | Since |\n| ----------------------------- | ----------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ----- |\n| **`authenticatorAttachment`** | <code><a href=\"#passkeyauthenticatorattachment\">PasskeyAuthenticatorAttachment</a></code> | The authenticator attachment modality. Only available on Android and Web.                                                                                                                             |                          | 0.1.0 |\n| **`requireResidentKey`**      | <code>boolean</code>                                                                      | Whether or not a discoverable credential (passkey) is required. This property is retained for backwards compatibility with WebAuthn Level 1. Prefer `residentKey`. Only available on Android and Web. |                          | 0.1.0 |\n| **`residentKey`**             | <code><a href=\"#passkeyresidentkey\">PasskeyResidentKey</a></code>                         | The extent to which the relying party desires to create a discoverable credential (passkey). Only available on Android and Web.                                                                       |                          | 0.1.0 |\n| **`userVerification`**        | <code><a href=\"#passkeyuserverification\">PasskeyUserVerification</a></code>               | The user verification requirement.                                                                                                                                                                    | <code>'preferred'</code> | 0.1.0 |\n\n\n#### PasskeyCredentialDescriptor\n\nA descriptor that identifies a specific credential.\n\n| Prop             | Type                            | Description                                                                                          | Since |\n| ---------------- | ------------------------------- | ---------------------------------------------------------------------------------------------------- | ----- |\n| **`id`**         | <code>string</code>             | The credential identifier as a base64url-encoded string.                                             | 0.1.0 |\n| **`transports`** | <code>PasskeyTransport[]</code> | The transports that the authenticator of the credential supports. Only available on Android and Web. | 0.1.0 |\n| **`type`**       | <code>'public-key'</code>       | The credential type.                                                                                 | 0.1.0 |\n\n\n#### PasskeyCredentialParameter\n\nA public key credential type and algorithm that the relying party\nserver supports.\n\n| Prop       | Type                      | Description                                                             | Since |\n| ---------- | ------------------------- | ----------------------------------------------------------------------- | ----- |\n| **`alg`**  | <code>number</code>       | The COSE algorithm identifier, e.g. `-7` for ES256 or `-257` for RS256. | 0.1.0 |\n| **`type`** | <code>'public-key'</code> | The credential type.                                                    | 0.1.0 |\n\n\n#### PasskeyRelyingParty\n\nThe relying party for which a passkey is created.\n\n| Prop       | Type                | Description                                                                                                                                | Since |\n| ---------- | ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ | ----- |\n| **`id`**   | <code>string</code> | The identifier of the relying party. This must be a registrable domain suffix of (or equal to) the domain that the app is associated with. | 0.1.0 |\n| **`name`** | <code>string</code> | The human-readable name of the relying party.                                                                                              | 0.1.0 |\n\n\n#### PasskeyUser\n\nThe user account for which a passkey is created.\n\n| Prop              | Type                | Description                                                                    | Since |\n| ----------------- | ------------------- | ------------------------------------------------------------------------------ | ----- |\n| **`displayName`** | <code>string</code> | The human-readable display name of the user account.                           | 0.1.0 |\n| **`id`**          | <code>string</code> | The user handle of the user account as a base64url-encoded string.             | 0.1.0 |\n| **`name`**        | <code>string</code> | The human-readable name of the user account, e.g. a username or email address. | 0.1.0 |\n\n\n#### GetPasskeyResult\n\nThe result of the passkey authentication.\n\nThis mirrors the WebAuthn `AuthenticationResponseJSON` so it can be\npassed to any WebAuthn server library for verification.\n\n| Prop                          | Type                                                                                      | Description                                                    | Since |\n| ----------------------------- | ----------------------------------------------------------------------------------------- | -------------------------------------------------------------- | ----- |\n| **`authenticatorAttachment`** | <code><a href=\"#passkeyauthenticatorattachment\">PasskeyAuthenticatorAttachment</a></code> | The attachment of the authenticator that provided the passkey. | 0.1.0 |\n| **`id`**                      | <code>string</code>                                                                       | The credential identifier as a base64url-encoded string.       | 0.1.0 |\n| **`rawId`**                   | <code>string</code>                                                                       | The raw credential identifier as a base64url-encoded string.   | 0.1.0 |\n| **`response`**                | <code><a href=\"#getpasskeyresponse\">GetPasskeyResponse</a></code>                         | The response of the authenticator.                             | 0.1.0 |\n| **`type`**                    | <code>'public-key'</code>                                                                 | The credential type.                                           | 0.1.0 |\n\n\n#### GetPasskeyResponse\n\nThe response of the authenticator for the authentication with an\nexisting passkey.\n\nThis mirrors the WebAuthn `AuthenticatorAssertionResponse` JSON\nserialization.\n\n| Prop                    | Type                | Description                                                                             | Since |\n| ----------------------- | ------------------- | --------------------------------------------------------------------------------------- | ----- |\n| **`authenticatorData`** | <code>string</code> | The authenticator data as a base64url-encoded string.                                   | 0.1.0 |\n| **`clientDataJSON`**    | <code>string</code> | The client data as a base64url-encoded string.                                          | 0.1.0 |\n| **`signature`**         | <code>string</code> | The signature as a base64url-encoded string.                                            | 0.1.0 |\n| **`userHandle`**        | <code>string</code> | The user handle (the `user.id` provided during creation) as a base64url-encoded string. | 0.1.0 |\n\n\n#### GetPasskeyOptions\n\n| Prop                   | Type                                                                        | Description                                                                                                                                                            | Default                  | Since |\n| ---------------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ | ----- |\n| **`allowCredentials`** | <code>PasskeyCredentialDescriptor[]</code>                                  | The credentials that are acceptable to the relying party server. If not provided, the user can select from any discoverable credential (passkey) of the relying party. |                          | 0.1.0 |\n| **`challenge`**        | <code>string</code>                                                         | The challenge provided by the relying party server as a base64url-encoded string.                                                                                      |                          | 0.1.0 |\n| **`rpId`**             | <code>string</code>                                                         | The identifier of the relying party.                                                                                                                                   |                          | 0.1.0 |\n| **`timeout`**          | <code>number</code>                                                         | The time in milliseconds that the caller is willing to wait for the operation to complete. Only available on Android and Web.                                          |                          | 0.1.0 |\n| **`userVerification`** | <code><a href=\"#passkeyuserverification\">PasskeyUserVerification</a></code> | The user verification requirement.                                                                                                                                     | <code>'preferred'</code> | 0.1.0 |\n\n\n#### IsAvailableResult\n\n| Prop            | Type                 | Description                                           | Since |\n| --------------- | -------------------- | ----------------------------------------------------- | ----- |\n| **`available`** | <code>boolean</code> | Whether or not passkeys are available on this device. | 0.1.0 |\n\n\n### Type Aliases\n\n\n#### PasskeyAuthenticatorAttachment\n\nThe authenticator attachment modality.\n\n<code>'cross-platform' | 'platform'</code>\n\n\n#### PasskeyTransport\n\nA transport that an authenticator supports.\n\n<code>'ble' | 'hybrid' | 'internal' | 'nfc' | 'smart-card' | 'usb'</code>\n\n\n#### PasskeyAttestation\n\nThe attestation conveyance preference.\n\n<code>'direct' | 'enterprise' | 'indirect' | 'none'</code>\n\n\n#### PasskeyResidentKey\n\nThe extent to which the relying party desires to create a\ndiscoverable credential (passkey).\n\n<code>'discouraged' | 'preferred' | 'required'</code>\n\n\n#### PasskeyUserVerification\n\nThe user verification requirement.\n\n- `discouraged`: The relying party prefers no user verification.\n- `preferred`: The relying party prefers user verification but will\n  not fail the operation without it.\n- `required`: The relying party requires user verification.\n\n<code>'discouraged' | 'preferred' | 'required'</code>\n\n</docgen-api>\n\n## Testing\n\nKeep the following in mind when testing your passkey integration:\n\n- **Real device recommended**: Test on a real device with a screen lock set up. On iOS, the Simulator supports passkeys since iOS 16. On Android, the Emulator requires Google Play services and a Google account with Google Password Manager set up.\n- **WebAuthn server**: The challenges in this plugin's examples are only placeholders. In production, the options must be generated and the results must be verified by a WebAuthn server library such as [SimpleWebAuthn](https://simplewebauthn.dev/) (Node.js) or [java-webauthn-server](https://github.com/Yubico/java-webauthn-server) (Java).\n- **Domain association**: The relying party ID must be associated with your app (see the Installation section). Domain association changes can take some time to propagate, as the files are cached by Apple and Google.\n\n## Limitations\n\nConditional UI (passkey autofill) is not supported by this plugin. The operating system autofill integrations target native text fields, not HTML inputs in a web view.\n\n## FAQ\n\n### How is this plugin different from other similar plugins?\n\nIt implements the full WebAuthn standard using the JSON serialization, so the options and results from any WebAuthn server library pass through unchanged on Android, iOS, and the Web. Passkey creation, authentication, and an `isAvailable()` capability check are all covered through a fully typed, actively maintained API. If you only need a local face or fingerprint check, a simpler biometric setup is enough; if you want to replace passwords with server-verified passkeys across every platform, this plugin is designed for exactly that.\n\n### Why do the plugin methods reject with the `DOMAIN_NOT_ASSOCIATED` error code?\n\nThis error means that your app is not associated with the domain of the relying party (`rp.id` / `rpId`). On Android, you must host a Digital Asset Links file at `https://<your-domain>/.well-known/assetlinks.json` that delegates the `common.get_login_creds` permission to your app. On iOS, you must add the Associated Domains capability with the `webcredentials` service type and host a matching `apple-app-site-association` file. See the [Installation](#installation) section for the details. Also keep in mind that changes to these files can take some time to propagate, as they are cached by Apple and Google.\n\n### Do I need my own WebAuthn server to use this plugin?\n\nYes. The challenges shown in the examples are only placeholders. In production, the options for `createPasskey(...)` and `getPasskey(...)` must be generated by a WebAuthn server, and the results must be verified by it, for example with a library such as [SimpleWebAuthn](https://simplewebauthn.dev/). Since the plugin uses the WebAuthn JSON serialization, any WebAuthn server library works unchanged.\n\n### Which devices support passkeys?\n\nOn Android, passkeys are supported on Android 9 (API level 28) and higher with an available credential provider such as Google Password Manager. On iOS, passkeys are supported on iOS 15 and higher. On the web, passkeys are supported in browsers that implement WebAuthn with a user-verifying platform authenticator. Use the `isAvailable()` method to check the availability at runtime.\n\n### Does this plugin support passkey autofill (Conditional UI)?\n\nNo, Conditional UI is not supported. The operating system autofill integrations target native text fields, not HTML inputs in a web view. See the [Limitations](#limitations) section for more details.\n\n### What is the difference between this plugin and the Biometrics plugin?\n\nThe [Biometrics](https://capawesome.io/docs/sdks/capacitor/biometrics/) plugin performs a local biometric check (e.g. face or fingerprint recognition) on the device, for example to protect a screen inside your app. The Passkeys plugin implements the WebAuthn standard, where the authentication is cryptographically verified by your server, making it suitable to replace password-based sign-in entirely.\n\n### Can I use this plugin with Ionic, React, Vue or Angular?\n\nYes, the plugin is framework-agnostic. It works in any Capacitor app regardless of the web framework, including Ionic with Angular, React, or Vue, as well as plain JavaScript projects.\n\n## Related Plugins\n\n- [Biometrics](https://capawesome.io/docs/sdks/capacitor/biometrics/): Request biometric authentication, such as face or fingerprint recognition.\n- [OAuth](https://capawesome.io/docs/sdks/capacitor/oauth/): Communicate with OAuth 2.0 and OpenID Connect providers.\n- [Password Autofill](https://capawesome.io/docs/sdks/capacitor/password-autofill/): Save passwords to the platform credential store.\n- [Secure Preferences](https://capawesome.io/docs/sdks/capacitor/secure-preferences/): Securely store key/value pairs such as passwords or tokens.\n\n## Newsletter\n\nStay up to date with the latest news and updates about the Capawesome, Capacitor, and Ionic ecosystem by subscribing to our [Capawesome Newsletter](https://cloud.capawesome.io/newsletter/).\n\n## Changelog\n\nSee [CHANGELOG.md](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/passkeys/CHANGELOG.md).\n\n## License\n\nSee [LICENSE](https://github.com/capawesome-team/capacitor-plugins/blob/main/packages/passkeys/LICENSE).\n","readmeFilename":"README.md"}