{
    "componentChunkName": "component---src-pages-blog-markdown-remark-fields-slug-js",
    "path": "/blog/webauthn-explained",
    "result": {"data":{"markdownRemark":{"html":"<p>WebAuthn—short for <em>Web Authentication</em>—is a modern standard that lets users log in securely without relying on passwords. Instead, it uses public‑key cryptography to verify identity, making phishing and credential theft far harder.</p>\n<p>In simple terms, a website (called the <em>relying party</em>) asks a browser and its authenticator—like your laptop’s fingerprint sensor or a security key—to create or use a cryptographic key pair. The private key never leaves your device. The public key gets stored by the website. That separation makes WebAuthn both secure and privacy‑preserving.</p>\n<p>WebAuthn is part of the broader <strong>FIDO2 framework</strong>, which also includes <strong>CTAP</strong> (Client to Authenticator Protocol). Together, they enable a wide range of authenticators—from YubiKeys and Windows Hello to Face ID and Android biometrics.</p>\n<p>In this guide, we’ll unpack why WebAuthn exists, how it works in practice, and how frameworks like <strong>SuperTokens</strong> make it easier to implement in your app.</p>\n<hr>\n<h2 id=\"why-webauthn-exists-fixing-the-password-problem\" style=\"position:relative;\"><a href=\"#why-webauthn-exists-fixing-the-password-problem\" aria-label=\"why webauthn exists fixing the password problem permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why WebAuthn Exists: Fixing the Password Problem</h2>\n<p>Passwords have been the default way to secure online accounts for decades—but they’ve always been fragile.</p>\n<ul>\n<li><strong>Phishing is easy.</strong> Fake sites can trick users into typing their passwords, which attackers reuse elsewhere.</li>\n<li><strong>Password reuse is rampant.</strong> One breach often cascades into many.</li>\n<li><strong>Weak passwords abound.</strong> Even complex ones can be guessed or brute‑forced.</li>\n<li><strong>Servers are single points of failure.</strong> Even hashed passwords can be cracked offline after a data leak.</li>\n</ul>\n<p>WebAuthn removes these weaknesses by design. Instead of a shared secret, it relies on <strong>asymmetric cryptography</strong>—a private key stored on the user’s device and a public key on the server. Authentication works by signing a random challenge rather than sharing a password, so nothing reusable ever leaves the user’s control.</p>\n<p>This means: no shared secrets, no phishing risk, and no password databases waiting to be breached.</p>\n<hr>\n<h2 id=\"how-the-web-authentication-api-works\" style=\"position:relative;\"><a href=\"#how-the-web-authentication-api-works\" aria-label=\"how the web authentication api works permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>How the Web Authentication API Works</h2>\n<p>The <strong>Web Authentication API</strong> is built directly into modern browsers. It allows web apps to register and verify cryptographic credentials for:</p>\n<ul>\n<li>Passwordless logins</li>\n<li>Two‑factor authentication</li>\n<li>Phishing‑resistant passkeys</li>\n</ul>\n<p>Here’s how it works at a high level.</p>\n<h3 id=\"registration-flow\" style=\"position:relative;\"><a href=\"#registration-flow\" aria-label=\"registration flow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Registration Flow</h3>\n<ol>\n<li>The server sends a <strong>challenge</strong> to the browser.</li>\n<li>The browser calls <code class=\"language-text\">navigator.credentials.create()</code> to ask the authenticator to generate a new credential.</li>\n<li>The authenticator creates a <strong>public‑private key pair</strong>.</li>\n<li>The private key stays securely on the device; the public key and credential ID go to the server.</li>\n<li>The server stores that information for future logins.</li>\n</ol>\n<h3 id=\"authentication-flow\" style=\"position:relative;\"><a href=\"#authentication-flow\" aria-label=\"authentication flow permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Authentication Flow</h3>\n<ol>\n<li>The server sends another <strong>challenge</strong> to verify identity.</li>\n<li>The browser calls <code class=\"language-text\">navigator.credentials.get()</code> to have the authenticator sign it.</li>\n<li>The authenticator signs the challenge using the stored private key.</li>\n<li>The browser returns the signed data to the server.</li>\n<li>The server verifies it with the stored public key.</li>\n</ol>\n<p>Because the credential is <strong>bound to the origin</strong> (for example, <code class=\"language-text\">example.com</code>), phishing attempts from fake domains fail automatically.</p>\n<hr>\n<h2 id=\"example-webauthn-in-action\" style=\"position:relative;\"><a href=\"#example-webauthn-in-action\" aria-label=\"example webauthn in action permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Example: WebAuthn in Action</h2>\n<p>Here’s a simplified TypeScript example of a client‑side registration flow using the Web Authentication API.</p>\n<div\n              class=\"gatsby-code-button-container\"\n              data-toaster-id=\"12997767729119668000\"\n              data-toaster-class=\"gatsby-code-button-toaster\"\n              data-toaster-text-class=\"gatsby-code-button-toaster-text\"\n              data-toaster-text=\"Copied!\"\n              data-toaster-duration=\"3500\"\n              onClick=\"copyToClipboard(`const options = {\n  challenge: Uint8Array.from(atob(serverChallenge), c => c.charCodeAt(0)),\n  rp: { name: &quot;My App&quot;, id: &quot;example.com&quot; },\n  user: {\n    id: Uint8Array.from(atob(userIdBase64), c => c.charCodeAt(0)),\n    name: userEmail,\n    displayName: userFullName\n  },\n  pubKeyCredParams: [{ type: &quot;public-key&quot;, alg: -7 }],\n  authenticatorSelection: { userVerification: &quot;preferred&quot; },\n  attestation: &quot;none&quot;\n};\n\nnavigator.credentials.create({ publicKey: options })\n  .then(cred => {\n    // Send credential info to server for verification\n  })\n  .catch(err => console.error(&quot;Registration failed&quot;, err));`, `12997767729119668000`)\"\n            >\n              <div\n                class=\"gatsby-code-button\"\n                data-tooltip=\"\"\n              >\n                <svg class=\"gatsby-code-button-icon\" xmlns=\"http://www.w3.org/2000/svg\" width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"><path fill=\"none\" d=\"M0 0h24v24H0V0z\"/><path d=\"M16 1H2v16h2V3h12V1zm-1 4l6 6v12H6V5h9zm-1 7h5.5L14 6.5V12z\"/></svg>\n              </div>\n            </div>\n<div class=\"gatsby-highlight\" data-language=\"ts\"><pre class=\"language-ts\"><code class=\"language-ts\"><span class=\"token keyword\">const</span> options <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n  challenge<span class=\"token operator\">:</span> Uint8Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token function\">atob</span><span class=\"token punctuation\">(</span>serverChallenge<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> c <span class=\"token operator\">=></span> c<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n  rp<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> name<span class=\"token operator\">:</span> <span class=\"token string\">\"My App\"</span><span class=\"token punctuation\">,</span> id<span class=\"token operator\">:</span> <span class=\"token string\">\"example.com\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  user<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span>\n    id<span class=\"token operator\">:</span> Uint8Array<span class=\"token punctuation\">.</span><span class=\"token function\">from</span><span class=\"token punctuation\">(</span><span class=\"token function\">atob</span><span class=\"token punctuation\">(</span>userIdBase64<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> c <span class=\"token operator\">=></span> c<span class=\"token punctuation\">.</span><span class=\"token function\">charCodeAt</span><span class=\"token punctuation\">(</span><span class=\"token number\">0</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    name<span class=\"token operator\">:</span> userEmail<span class=\"token punctuation\">,</span>\n    displayName<span class=\"token operator\">:</span> userFullName\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  pubKeyCredParams<span class=\"token operator\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">{</span> type<span class=\"token operator\">:</span> <span class=\"token string\">\"public-key\"</span><span class=\"token punctuation\">,</span> alg<span class=\"token operator\">:</span> <span class=\"token operator\">-</span><span class=\"token number\">7</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">,</span>\n  authenticatorSelection<span class=\"token operator\">:</span> <span class=\"token punctuation\">{</span> userVerification<span class=\"token operator\">:</span> <span class=\"token string\">\"preferred\"</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n  attestation<span class=\"token operator\">:</span> <span class=\"token string\">\"none\"</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n\nnavigator<span class=\"token punctuation\">.</span>credentials<span class=\"token punctuation\">.</span><span class=\"token function\">create</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span> publicKey<span class=\"token operator\">:</span> options <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">then</span><span class=\"token punctuation\">(</span>cred <span class=\"token operator\">=></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\">// Send credential info to server for verification</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span>\n  <span class=\"token punctuation\">.</span><span class=\"token function\">catch</span><span class=\"token punctuation\">(</span>err <span class=\"token operator\">=></span> <span class=\"token builtin\">console</span><span class=\"token punctuation\">.</span><span class=\"token function\">error</span><span class=\"token punctuation\">(</span><span class=\"token string\">\"Registration failed\"</span><span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span></code></pre></div>\n<p>Behind the scenes, your browser communicates with the authenticator (e.g., fingerprint reader, security key, or platform chip). No passwords are exchanged—only signed cryptographic proof that you’re the same person who registered earlier.</p>\n<hr>\n<h2 id=\"webauthn-and-supertokens-passwordless-made-simple\" style=\"position:relative;\"><a href=\"#webauthn-and-supertokens-passwordless-made-simple\" aria-label=\"webauthn and supertokens passwordless made simple permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>WebAuthn and SuperTokens: Passwordless Made Simple</h2>\n<p>While WebAuthn provides the underlying standard, integrating it securely takes effort. That’s where <strong>SuperTokens</strong> helps. It’s an open‑source authentication framework that simplifies adding passwordless or passkey‑based login to your app.</p>\n<h3 id=\"why-use-supertokens-with-webauthn\" style=\"position:relative;\"><a href=\"#why-use-supertokens-with-webauthn\" aria-label=\"why use supertokens with webauthn permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Why Use SuperTokens with WebAuthn</h3>\n<ul>\n<li><strong>Built‑in passkey support:</strong> SuperTokens offers ready‑to‑use backend recipes and frontend SDKs (Node.js, Python) for passwordless flows.</li>\n<li><strong>Configurable security:</strong> You can easily customize your relying party ID, attestation policy, or authenticator settings.</li>\n<li><strong>Fallback ready:</strong> Combine WebAuthn with magic links, OTPs, or passwords to cover devices that don’t yet support passkeys.</li>\n<li><strong>Open‑source control:</strong> You have full visibility into the backend logic—no vendor lock‑in or black boxes.</li>\n</ul>\n<p><a href=\"https://supertokens.com/docs/authentication/passkeys/introduction\" target=\"_blank\" rel=\"nofollow\">Get started now</a></p>\n<hr>\n<h2 id=\"practical-tips-for-developers\" style=\"position:relative;\"><a href=\"#practical-tips-for-developers\" aria-label=\"practical tips for developers permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Practical Tips for Developers</h2>\n<p>Before diving into production, consider these common challenges and best practices:</p>\n<ul>\n<li><strong>Always generate challenges on the server.</strong> Never reuse or predict them.</li>\n<li><strong>Ensure correct origin and relying party ID.</strong> Even a mismatched subdomain can cause silent failures.</li>\n<li><strong>Offer multiple authenticators.</strong> Encourage users to register at least two (e.g., a device biometric and a hardware key).</li>\n<li><strong>Design fallback flows.</strong> Account for device loss or unsupported browsers.</li>\n<li><strong>Test across browsers and platforms.</strong> Safari, Chrome, and Edge each have subtle quirks.</li>\n</ul>\n<p>With thoughtful UX and the right libraries, WebAuthn can deliver a login experience that’s both secure and user‑friendly.</p>\n<hr>\n<h2 id=\"the-future-passkeys-everywhere\" style=\"position:relative;\"><a href=\"#the-future-passkeys-everywhere\" aria-label=\"the future passkeys everywhere permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>The Future: Passkeys Everywhere</h2>\n<p>You’ve probably heard the term <em>passkey</em>. It’s simply a user‑friendly name for WebAuthn credentials that sync across devices through cloud services like iCloud Keychain or Google Password Manager. Passkeys make WebAuthn even more practical by solving the “new device” problem.</p>\n<p>The industry momentum is clear: Apple, Google, and Microsoft now fully support passkeys. As adoption grows, we’re heading toward a world where passwords finally fade into the background—and secure logins just <em>work</em>.</p>\n<hr>\n<h2 id=\"conclusion\" style=\"position:relative;\"><a href=\"#conclusion\" aria-label=\"conclusion permalink\" class=\"anchor before\"><svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" version=\"1.1\" viewBox=\"0 0 16 16\" width=\"16\"><path fill-rule=\"evenodd\" d=\"M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z\"></path></svg></a>Conclusion</h2>\n<p>WebAuthn changes the game for web authentication. By replacing passwords with public‑key cryptography, it eliminates phishing risks, credential reuse, and password fatigue—all while improving the user experience.</p>\n<p>For developers, adopting WebAuthn directly can be complex, but frameworks like <strong>SuperTokens</strong> make it approachable. Whether you’re building a startup or securing enterprise users, passwordless authentication is no longer a futuristic goal—it’s ready to use today.</p>","frontmatter":{"date":"October 14, 2025","title":"WebAuthn Explained","cover":"webauthn-explained.png","author":"Joel Coutinho","description":"A comprehensive guide to understanding WebAuthn, its benefits, and implementation details."},"fields":{"slug":"/webauthn-explained/"}},"site":{"siteMetadata":{"title":"SuperTokens Blog"}}},"pageContext":{"id":"b84cb08a-0943-5e35-8a02-c0de097acdcb","fields__slug":"/webauthn-explained/","__params":{"fields__slug":"webauthn-explained"}}},
    "staticQueryHashes": []}