<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Authgear</title>
    <description>The latest articles on Forem by Authgear (@authgear).</description>
    <link>https://forem.com/authgear</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F7156%2F2dbc3cc6-6db9-46c0-ac28-248329f9c186.png</url>
      <title>Forem: Authgear</title>
      <link>https://forem.com/authgear</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/authgear"/>
    <language>en</language>
    <item>
      <title>Passkey vs Password: Are Passkeys Safer Than Passwords? (2026)</title>
      <dc:creator>Fung</dc:creator>
      <pubDate>Wed, 06 May 2026 14:56:48 +0000</pubDate>
      <link>https://forem.com/authgear/passkey-vs-password-are-passkeys-safer-than-passwords-2026-5hnh</link>
      <guid>https://forem.com/authgear/passkey-vs-password-are-passkeys-safer-than-passwords-2026-5hnh</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.authgear.com/post/passkey-vs-password-why-passkeys-are-the-future-of-security" rel="noopener noreferrer"&gt;authgear.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; — Passkeys are cryptographic key pairs that replace passwords. The private key never leaves your device, so passkeys cannot be phished, guessed, or leaked in a server breach. The trade-off is recovery — lose all your devices and you fall back to email reset, just like passwords. In 2026 every major OS supports passkeys natively, so the comparison is now a real one.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In 2026, passkeys have moved from experiment to mainstream. Apple, Google, and Microsoft now support passkeys across all major platforms. Over 15 billion accounts can use passkeys. And the question developers and security teams ask most often is simple: &lt;strong&gt;are passkeys actually safer than passwords?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The short answer is yes — significantly. The longer answer explains exactly why, and what it means for your app.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passkey vs password: head-to-head
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Dimension&lt;/th&gt;
&lt;th&gt;Password&lt;/th&gt;
&lt;th&gt;Passkey&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Storage&lt;/td&gt;
&lt;td&gt;Memorised / password manager&lt;/td&gt;
&lt;td&gt;Cryptographic key pair on device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phishing-resistant&lt;/td&gt;
&lt;td&gt;No — fake sites steal passwords&lt;/td&gt;
&lt;td&gt;Yes — origin-bound, nothing to steal&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reusable across sites&lt;/td&gt;
&lt;td&gt;Yes (a vulnerability)&lt;/td&gt;
&lt;td&gt;No — per-site key pair&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Server breach exposure&lt;/td&gt;
&lt;td&gt;Whole password at risk&lt;/td&gt;
&lt;td&gt;Public key only — useless without your device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brute-force-resistant&lt;/td&gt;
&lt;td&gt;Depends on length and complexity&lt;/td&gt;
&lt;td&gt;Yes — cryptographic key, not a guessable string&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-device&lt;/td&gt;
&lt;td&gt;User must remember or sync via manager&lt;/td&gt;
&lt;td&gt;Synced via Apple Keychain, Google Password Manager, or 1Password&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Recovery if all devices lost&lt;/td&gt;
&lt;td&gt;Email reset&lt;/td&gt;
&lt;td&gt;Email reset (same fallback)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User typing required&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;td&gt;No — Face ID, Touch ID, or PIN tap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NIST AAL level&lt;/td&gt;
&lt;td&gt;AAL1&lt;/td&gt;
&lt;td&gt;AAL2 (single-factor passkey with user verification)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Passkey vs password: which is safer in 2026?
&lt;/h2&gt;

&lt;p&gt;Passkeys are safer than passwords in every measurable way. Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Passkeys cannot be phished.&lt;/strong&gt; When you log in with a passkey, your device signs a challenge from the server using a private key that never leaves your device. A fake login page gets nothing — there's no password to steal.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passkeys cannot be reused.&lt;/strong&gt; Each passkey is unique to the website it was created for. A passkey for your banking app cannot be used on any other site, even if the attacker controls the other site.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passkeys cannot be guessed.&lt;/strong&gt; Passkeys are cryptographic keys generated randomly. There is no equivalent of "password123" or a dictionary attack.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passkeys cannot be leaked in bulk.&lt;/strong&gt; Servers only store your public key — even if a server is breached, attackers get a public key that is useless without the private key on your device.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;According to Google, accounts with passkeys are 99.9% less likely to be compromised than those relying on passwords alone. Phishing and credential stuffing — responsible for the majority of account takeovers — simply don't work against passkeys.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding Passkeys: How They Work
&lt;/h2&gt;

&lt;p&gt;A passkey is a pair of cryptographic keys: a &lt;strong&gt;private key&lt;/strong&gt; stored securely on your device, and a &lt;strong&gt;public key&lt;/strong&gt; stored on the server. Here's what happens when you log in:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The server sends a unique challenge to your device&lt;/li&gt;
&lt;li&gt;Your device uses Face ID, Touch ID, or PIN to unlock the private key&lt;/li&gt;
&lt;li&gt;The private key signs the challenge&lt;/li&gt;
&lt;li&gt;The server verifies the signature using your public key&lt;/li&gt;
&lt;li&gt;You're in — without sending any secret over the internet&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Think of it like a safe deposit box. The bank holds the lock (your public key). Only your key (private key, on your device) can open it. The bank never sees your key, and you never share it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key benefits at a glance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Phishing-resistant:&lt;/strong&gt; Nothing to steal — your private key never leaves your device&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No passwords to remember:&lt;/strong&gt; Authentication via biometric (Face ID, fingerprint) or device PIN&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cross-device sync:&lt;/strong&gt; Passkeys sync across your devices via Apple Keychain, Google Password Manager, or 1Password&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Works everywhere:&lt;/strong&gt; iOS, Android, Windows, macOS, Chrome, Safari, Firefox&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Passwords Are No Longer Enough
&lt;/h2&gt;

&lt;p&gt;Passwords have been the primary authentication method for 60 years, and they're failing us. Here's why:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Weak passwords:&lt;/strong&gt; 80% of breaches involve weak or reused passwords (Verizon DBIR 2025). Users choose memorable over secure.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password reuse:&lt;/strong&gt; The average person reuses passwords across 5+ accounts. One breach exposes all of them.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phishing:&lt;/strong&gt; Even sophisticated users get fooled. Phishing attacks are responsible for 36% of data breaches.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Data breaches:&lt;/strong&gt; 26 billion records were leaked in the "Mother of All Breaches" in early 2024. Those passwords are now on the dark web.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password fatigue:&lt;/strong&gt; The average person manages 100+ passwords. The cognitive load drives risky behavior (writing down passwords, reusing them).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The core problem: passwords are &lt;em&gt;secrets shared with a server&lt;/em&gt;. Every time you log in, you send your secret over the internet. Every server that stores your password is a potential breach. Passkeys eliminate this entirely.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passkeys vs passwords: full feature comparison (2026)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Password&lt;/th&gt;
&lt;th&gt;Passkey&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Security model&lt;/td&gt;
&lt;td&gt;Shared secret (stored on server)&lt;/td&gt;
&lt;td&gt;Public-key cryptography (private key never leaves device)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phishing resistance&lt;/td&gt;
&lt;td&gt;❌ Vulnerable — fake sites steal passwords easily&lt;/td&gt;
&lt;td&gt;✅ Immune — passkeys are bound to the domain they were created for&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Brute-force resistance&lt;/td&gt;
&lt;td&gt;❌ Weak passwords are cracked in seconds&lt;/td&gt;
&lt;td&gt;✅ No password to crack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Credential stuffing&lt;/td&gt;
&lt;td&gt;❌ At risk if passwords are reused&lt;/td&gt;
&lt;td&gt;✅ Each passkey is unique per site&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data breach exposure&lt;/td&gt;
&lt;td&gt;❌ Passwords exposed if server is breached&lt;/td&gt;
&lt;td&gt;✅ Only public key stored — useless alone&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;User experience&lt;/td&gt;
&lt;td&gt;❌ Remember and type a password&lt;/td&gt;
&lt;td&gt;✅ Biometric or PIN tap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Login speed&lt;/td&gt;
&lt;td&gt;⚠️ Slower — type password + optional MFA&lt;/td&gt;
&lt;td&gt;✅ Faster — one biometric tap&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Cross-device sync&lt;/td&gt;
&lt;td&gt;❌ No (password managers partially solve this)&lt;/td&gt;
&lt;td&gt;✅ Yes (iCloud Keychain, Google Password Manager)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;MFA requirement&lt;/td&gt;
&lt;td&gt;⚠️ Recommended but often skipped&lt;/td&gt;
&lt;td&gt;✅ Built-in (device PIN/biometric is the second factor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Lost device recovery&lt;/td&gt;
&lt;td&gt;⚠️ Password still works from other devices&lt;/td&gt;
&lt;td&gt;⚠️ Recovery via backup passkeys or account recovery flow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Platform support (2026)&lt;/td&gt;
&lt;td&gt;✅ Universal&lt;/td&gt;
&lt;td&gt;✅ iOS, Android, Windows, macOS, major browsers&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Implementation cost&lt;/td&gt;
&lt;td&gt;⚠️ Low (passwords are simple)&lt;/td&gt;
&lt;td&gt;⚠️ Medium (WebAuthn API or auth platform like Authgear)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Passkeys in 2026: Real-World Adoption
&lt;/h2&gt;

&lt;p&gt;Passkeys have crossed the tipping point from "interesting experiment" to "production standard." Here's where things stand in 2026:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;15 billion accounts&lt;/strong&gt; can now authenticate with passkeys, according to the FIDO Alliance (2026).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google:&lt;/strong&gt; Passkey sign-ins surpassed 1 billion per month in late 2025 (Google Identity blog), with a 99.9% lower account compromise rate than passwords.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Apple:&lt;/strong&gt; Passkeys are the default sign-in method for new iCloud accounts — announced at WWDC 2025.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Microsoft:&lt;/strong&gt; "Passwordless by default" for new Microsoft 365 accounts since 2025. Passkeys are the encouraged replacement.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub:&lt;/strong&gt; Passkeys available for all 100M+ users since early 2024.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Amazon:&lt;/strong&gt; Passkeys available for shopping accounts across the US, UK, and Australia.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For developers, the message is clear: users increasingly expect passkey support. Apps without passkeys will feel dated within 12–18 months.&lt;/p&gt;

&lt;h2&gt;
  
  
  Password vs passkey: which is easier for users?
&lt;/h2&gt;

&lt;p&gt;Passkeys win on ease of use — not just security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signing in with a password&lt;/strong&gt; involves recalling or retrieving a credential, typing it (with a risk of typos), and often completing a second-factor step such as entering an SMS code or an authenticator app TOTP. Average sign-in time for a password + SMS-OTP flow is roughly 20–30 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Signing in with a passkey&lt;/strong&gt; involves a single biometric prompt — Face ID, Touch ID, or a device PIN tap. No typing, no copy-pasting, no switching apps. Average sign-in time drops to 2–3 seconds.&lt;/p&gt;

&lt;p&gt;Other UX differences worth noting:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Account creation:&lt;/strong&gt; Passkey enrolment requires a single biometric tap after the initial sign-up. No "create a strong password" friction, no password-confirmation field.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Recovery flow:&lt;/strong&gt; The trade-off is here. If a user loses all their devices, passkey recovery falls back to email verification or a backup code — the same friction as a password reset. It is no worse, but it is no better. Design a clear recovery path before you go passkey-only.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Password managers as a comparison:&lt;/strong&gt; Password managers remove the memorisation burden, but users still type. They also require the manager app to be installed and unlocked. Passkeys are the keychain, built into the OS — nothing extra to install.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One-tap login UX:&lt;/strong&gt; Modern passkey prompts appear automatically when a registered device is detected. Returning users often sign in without touching a keyboard at all. This is the UX that makes passkeys compelling for consumer apps where login friction directly affects conversion rate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The UX case for passkeys is strong enough that Google's internal data shows passkey sign-ins are 4× faster than passwords.&lt;/p&gt;

&lt;h2&gt;
  
  
  Are passkeys 2FA or MFA?
&lt;/h2&gt;

&lt;p&gt;This question comes up often because it matters for compliance. The precise answer is: a passkey alone is a single factor ("something you have" — the device), but in practice it always requires user verification, which adds a second factor ("something you are" with biometrics, or "something you know" with a PIN).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What NIST says:&lt;/strong&gt; NIST SP 800-63B classifies a passkey used with user verification as AAL2 — the same level as a password plus an authenticator app. AAL3 (the highest level, required for federal systems and some financial regulators) additionally requires a hardware-bound authenticator that resists physical extraction; a passkey synced to the cloud does not qualify, but a device-bound passkey on a hardware key like a YubiKey does.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Practical implications for developers:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;For most consumer and B2B apps, a passkey replaces both the password and the SMS-OTP or authenticator app. You can remove the separate 2FA step entirely — the passkey prompt already satisfies it.&lt;/li&gt;
&lt;li&gt;For regulated sectors (banking under FFIEC, US federal apps requiring FIDO2 at AAL3), check whether your regulator explicitly requires separate authentication channels. In those cases, a synced passkey may be AAL2 but not AAL3, and an additional hardware-bound token may still be required.&lt;/li&gt;
&lt;li&gt;For enterprise apps enforcing MFA policies, passkeys satisfy most "MFA required" rules — but verify with your IdP (Authgear, Okta, Azure AD) that the policy recognises passkey sign-ins as multi-factor events.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Bottom line:&lt;/strong&gt; For the overwhelming majority of apps, a passkey replaces password + 2FA as a single, simpler step. If you are building in a highly regulated environment, verify your specific AAL requirements before removing the separate MFA step.&lt;/p&gt;

&lt;h2&gt;
  
  
  Passkeys vs Passwords: Which Should You Use?
&lt;/h2&gt;

&lt;p&gt;The answer is almost always &lt;strong&gt;passkeys&lt;/strong&gt; — but a phased approach is practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;New apps:&lt;/strong&gt; Implement passkeys from day one. Use a platform like Authgear that provides passkey support with a few lines of code.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Existing apps:&lt;/strong&gt; Add passkeys as a login option alongside passwords. Let users opt in. Most will — passkeys are easier to use.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enterprise apps:&lt;/strong&gt; If you use Active Directory / LDAP internally, you can still add passkeys for external-facing applications while keeping your internal directory.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Legacy systems:&lt;/strong&gt; If passkey support is truly impossible, at minimum enforce MFA on all accounts to close the worst password vulnerabilities.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  How to Enable Passkeys in Your App with Authgear
&lt;/h2&gt;

&lt;p&gt;Implementing passkeys from scratch requires handling WebAuthn registration, authentication challenges, key storage, and cross-device sync — a significant engineering effort. Authgear provides passkey support out of the box.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;With Authgear, enabling passkeys takes minutes, not weeks:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enable passkeys in the Authgear Portal:&lt;/strong&gt; Go to Authentication → Login Methods → Passkeys and toggle them on. No code required.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choose your strategy&lt;/strong&gt; — passkeys + passwords (users pick), passkeys only (enforce passwordless), or passkeys for new users while keeping passwords for existing ones (gradual migration).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Add the Authgear SDK to your app:&lt;/strong&gt; Available for React, Next.js, React Native, Flutter, iOS, Android, and more.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test on supported devices:&lt;/strong&gt; iOS 16+, Android 9+, Chrome 108+, Safari 16+, Edge 109+&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Your users authenticate with Face ID, Touch ID, or PIN — and you handle zero credential storage, no password resets, and no phishing risk.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.authgear.com/features/passkeys" rel="noopener noreferrer"&gt;Learn more about Authgear passkeys →&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of Authentication
&lt;/h2&gt;

&lt;p&gt;The writing is on the wall: passwords are on their way out. The transition is already happening across every major platform. As passkey adoption grows, expect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Passwordless by default:&lt;/strong&gt; More platforms will make passkeys the default login method, not an option&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Passkeys for payments:&lt;/strong&gt; Strong customer authentication (SCA) requirements in finance will push passkey adoption in banking and fintech&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AI-resistant authentication:&lt;/strong&gt; As AI makes social engineering more sophisticated, phishing-resistant passkeys become more critical, not less&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Shared device scenarios:&lt;/strong&gt; Work is ongoing for enterprise managed-device passkey scenarios, filling the last remaining gap&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The era of passwords is drawing to a close. Apps that adopt passkeys today will have a security and UX advantage tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is a passkey vs a password?
&lt;/h3&gt;

&lt;p&gt;A password is a secret string you create and remember (or store in a password manager). A passkey is a cryptographic key pair — a private key stored on your device and a public key stored on the server. You never type a passkey; instead, you authenticate with Face ID, Touch ID, or a PIN. Passkeys are more secure because they can't be phished, guessed, or leaked in a data breach.&lt;/p&gt;

&lt;h3&gt;
  
  
  Are passkeys safer than passwords?
&lt;/h3&gt;

&lt;p&gt;Yes, significantly. Passkeys are phishing-resistant (fake sites can't steal them), brute-force-resistant (cryptographic keys can't be guessed), and breach-resistant (servers only store public keys, which are useless without your device). Google reports passkey accounts have a 99.9% lower compromise rate than password accounts.&lt;/p&gt;

&lt;h3&gt;
  
  
  Can passkeys replace two-factor authentication (2FA)?
&lt;/h3&gt;

&lt;p&gt;Yes. A passkey combines something you have (your device) with something you are (your biometric) or something you know (your PIN). This makes a passkey equivalent to a password plus a second factor — you don't need a separate SMS code or authenticator app. Passkeys meet or exceed NIST AAL2 authentication requirements.&lt;/p&gt;

&lt;h3&gt;
  
  
  What happens if I lose my device?
&lt;/h3&gt;

&lt;p&gt;Passkeys sync across your devices via Apple Keychain, Google Password Manager, or a cross-platform manager like 1Password. If you lose one device, you can still log in from another. For users without a second device, most services provide account recovery via email verification or a backup code — just like password resets today.&lt;/p&gt;

&lt;h3&gt;
  
  
  Do passkeys work on all browsers and devices?
&lt;/h3&gt;

&lt;p&gt;In 2026, passkeys work on the vast majority of devices: iOS 16+, Android 9+, Windows 10+ with Windows Hello, macOS 13+ with Touch ID, and all major browsers (Chrome 108+, Safari 16+, Firefox 122+, Edge 109+). For older devices, passkey-enabled services typically still offer password fallback.&lt;/p&gt;

&lt;h3&gt;
  
  
  How do I add passkey support to my app?
&lt;/h3&gt;

&lt;p&gt;You can implement passkeys directly using the WebAuthn API (built into modern browsers) or use an authentication platform like &lt;a href="https://www.authgear.com/features/passkeys" rel="noopener noreferrer"&gt;Authgear&lt;/a&gt; that handles the complexity for you. Authgear supports passkeys across all major platforms with a few lines of SDK code and a configuration toggle in the portal.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.authgear.com/post/passkey-vs-password-why-passkeys-are-the-future-of-security" rel="noopener noreferrer"&gt;authgear.com&lt;/a&gt;. Authgear is an authentication platform for modern apps — passkeys, MFA, SSO, session management.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>webauthn</category>
      <category>authentication</category>
    </item>
    <item>
      <title>SSL Certificate Chain: What It Is and How to Fix It</title>
      <dc:creator>Fung</dc:creator>
      <pubDate>Wed, 06 May 2026 14:40:14 +0000</pubDate>
      <link>https://forem.com/authgear/ssl-certificate-chain-what-it-is-and-how-to-fix-it-206j</link>
      <guid>https://forem.com/authgear/ssl-certificate-chain-what-it-is-and-how-to-fix-it-206j</guid>
      <description>&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.authgear.com/post/ssl-certificate-chain" rel="noopener noreferrer"&gt;authgear.com&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;tl;dr&lt;/strong&gt; — An SSL certificate chain is the sequence of digital certificates that links your website's certificate to a root Certificate Authority (CA) browsers trust: your &lt;strong&gt;leaf certificate&lt;/strong&gt; → one or more &lt;strong&gt;intermediate certificates&lt;/strong&gt; → a trusted &lt;strong&gt;root certificate&lt;/strong&gt;. Your server must send the leaf and intermediates; the root is pre-installed in the client. If any intermediate is missing, mobile browsers and API clients fail — even though desktop Chrome may still work due to caching.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What Is an SSL Certificate Chain?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;SSL certificate chain&lt;/strong&gt; — also called a certificate trust chain or chain of trust — is a sequence of certificates that connects your website's certificate back to a root Certificate Authority (CA) that browsers inherently trust.&lt;/p&gt;

&lt;p&gt;Think of it like a chain of vouchers: your site's certificate is vouched for by an intermediate CA, which is in turn vouched for by a root CA. Browsers come pre-installed with a list of trusted root CAs. If a browser can follow the chain from your certificate up to a trusted root without any gaps, the connection is trusted. If any link in the chain is missing, the browser shows a security error — even if your certificate itself is perfectly valid.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;💡 &lt;strong&gt;New to SSL certificates?&lt;/strong&gt; Before diving into chains, you may want to read &lt;a href="https://www.authgear.com/post/what-is-ssl-certificate" rel="noopener noreferrer"&gt;What Is an SSL Certificate? A Developer's Guide&lt;/a&gt; for an overview of how certificates work.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  The Three Levels of a Certificate Chain
&lt;/h2&gt;

&lt;p&gt;Every certificate chain has the same structure, regardless of which CA issued your certificate:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Level&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;What It Is&lt;/th&gt;
&lt;th&gt;Who Provides It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1 (leaf)&lt;/td&gt;
&lt;td&gt;Leaf certificate&lt;/td&gt;
&lt;td&gt;The certificate issued to your specific domain&lt;/td&gt;
&lt;td&gt;You — installed on your web server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2 (middle)&lt;/td&gt;
&lt;td&gt;Intermediate certificate(s)&lt;/td&gt;
&lt;td&gt;Issued by the root CA to authorize an intermediate CA to issue domain certificates&lt;/td&gt;
&lt;td&gt;Your CA — must also be served by your web server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3 (root)&lt;/td&gt;
&lt;td&gt;Root certificate&lt;/td&gt;
&lt;td&gt;Self-signed certificate from a trusted root CA&lt;/td&gt;
&lt;td&gt;The CA — pre-installed in browsers and operating systems&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When a browser connects to your site, your server sends the leaf certificate and any intermediate certificates. The browser checks whether the chain connects to a trusted root in its built-in trust store. The root certificate itself is never sent by the server — it's expected to already be present on the client.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why the Chain Exists: Root CAs Stay Offline
&lt;/h2&gt;

&lt;p&gt;Root CA private keys are among the most sensitive secrets in internet infrastructure. A compromised root CA could be used to forge trusted certificates for any website in the world — banks, governments, email providers, anything. To protect root private keys, root CAs are kept &lt;strong&gt;offline&lt;/strong&gt;, physically air-gapped from the internet.&lt;/p&gt;

&lt;p&gt;Because root CAs are offline, they can't sign website certificates directly. Instead, they issue &lt;strong&gt;intermediate CA certificates&lt;/strong&gt; to subordinate authorities who do the day-to-day work of signing domain certificates. If an intermediate CA is ever compromised, it can be revoked without touching the root CA or invalidating the entire trust hierarchy.&lt;/p&gt;

&lt;p&gt;This is why your server is responsible for serving the intermediate certificate. The root is assumed to be in the client's trust store. Everything between your leaf certificate and the root must come from your server.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Most Common Chain Error: Missing Intermediate Certificate
&lt;/h2&gt;

&lt;p&gt;The single most frequent SSL misconfiguration is a &lt;strong&gt;missing intermediate certificate&lt;/strong&gt;. Your leaf certificate is installed, but the intermediate CA certificate is not being served alongside it.&lt;/p&gt;

&lt;p&gt;Here's why this error is so deceptive:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Desktop browsers often cache intermediates&lt;/strong&gt; — Chrome and Firefox maintain a local cache of intermediate certificates they've encountered before. If a previous site used the same intermediate CA, the browser already has it and won't notice your missing intermediate.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile browsers don't cache&lt;/strong&gt; — iOS Safari, Android Chrome on fresh installs, and most mobile browsers will fail immediately if the intermediate is missing from the server response.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;API clients and server-to-server calls always fail&lt;/strong&gt; — &lt;code&gt;curl&lt;/code&gt;, Python's &lt;code&gt;requests&lt;/code&gt;, Node's &lt;code&gt;https&lt;/code&gt; module, Java's &lt;code&gt;HttpClient&lt;/code&gt;, and nearly every backend HTTP library do not cache intermediates. They reject the connection outright.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is why a misconfigured chain can pass all your desktop browser testing and still silently break mobile users and backend API integrations in production.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Classic incident pattern:&lt;/strong&gt; You deploy a renewed certificate. Desktop Chrome works fine (it had the intermediate cached from your previous cert). You close the ticket. Three hours later, the mobile app team reports that all API calls are failing with SSL errors. The server is only sending the leaf certificate — no intermediate.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  How to Check Your Certificate Chain
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1: Authgear SSL Certificate Chain Checker (recommended)
&lt;/h3&gt;

&lt;p&gt;Use the &lt;a href="https://www.authgear.com/tools/ssl-checker" rel="noopener noreferrer"&gt;Authgear SSL Checker&lt;/a&gt; to visualize your full certificate chain. It shows each level — leaf certificate, intermediate(s), and root — and immediately flags if any intermediates are missing or if the chain fails to connect to a trusted root.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;🔒 &lt;strong&gt;Run this after every certificate renewal.&lt;/strong&gt; Let's Encrypt's Certbot correctly configures the chain when you use &lt;code&gt;fullchain.pem&lt;/code&gt; — but if you manually install a paid CA certificate, it's easy to accidentally deploy only the leaf certificate. The SSL Checker catches this instantly.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Option 2: OpenSSL (command line)
&lt;/h3&gt;

&lt;p&gt;You can inspect exactly what your server is serving with OpenSSL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# View the full certificate chain your server is sending&lt;/span&gt;
openssl s_client &lt;span class="nt"&gt;-connect&lt;/span&gt; yourdomain.com:443 &lt;span class="nt"&gt;-showcerts&lt;/span&gt;

&lt;span class="c"&gt;# Count the number of BEGIN CERTIFICATE blocks in the output:&lt;/span&gt;
&lt;span class="c"&gt;# - 2 blocks: leaf + one intermediate (normal for Let's Encrypt)&lt;/span&gt;
&lt;span class="c"&gt;# - 1 block: leaf only — your intermediate is missing&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you see only one &lt;code&gt;BEGIN CERTIFICATE&lt;/code&gt; block, your server is sending only the leaf certificate. The chain is incomplete.&lt;/p&gt;

&lt;h3&gt;
  
  
  What a Decoded Certificate Chain Looks Like
&lt;/h3&gt;

&lt;p&gt;To see what's actually inside each certificate in the chain, decode them with &lt;code&gt;openssl x509 -text -noout&lt;/code&gt;. Here's a real example from &lt;code&gt;cloudflare.com&lt;/code&gt; (truncated for readability):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Leaf certificate
Subject: CN = cloudflare.com
Issuer:  C = US, O = Google Trust Services, CN = WE1
Validity:
    Not Before: Apr  3 00:00:00 2026 GMT
    Not After : Jun 30 23:59:59 2026 GMT
Signature Algorithm: ecdsa-with-SHA256
Subject Alternative Name:
    DNS:cloudflare.com, DNS:*.cloudflare.com, ...

# Intermediate certificate (the one your server must also send)
Subject: C = US, O = Google Trust Services, CN = WE1
Issuer:  C = US, O = Google Trust Services LLC, CN = GTS Root R4
Validity:
    Not Before: Dec 13 09:00:00 2023 GMT
    Not After : Feb 20 14:00:00 2029 GMT
Signature Algorithm: ecdsa-with-SHA384

# Root certificate (NOT sent by the server — already in the client trust store)
Subject: C = US, O = Google Trust Services LLC, CN = GTS Root R4
Issuer:  C = US, O = Google Trust Services LLC, CN = GTS Root R4    ← self-signed
Signature Algorithm: ecdsa-with-SHA384
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Notice the pattern: the &lt;strong&gt;issuer&lt;/strong&gt; of each certificate matches the &lt;strong&gt;subject&lt;/strong&gt; of the certificate above it. That's how the browser walks the chain. The root certificate is self-signed — its subject and issuer are identical — and it's the one your server doesn't send because it has to already be in the client's trust store.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Fix a Broken Certificate Chain
&lt;/h2&gt;

&lt;p&gt;The fix is always the same concept: configure your web server to send the intermediate certificate alongside your leaf certificate. The exact steps depend on your server and how you obtained your certificate.&lt;/p&gt;

&lt;h3&gt;
  
  
  If you used Certbot (Let's Encrypt)
&lt;/h3&gt;

&lt;p&gt;Certbot generates several certificate files in &lt;code&gt;/etc/letsencrypt/live/yourdomain.com/&lt;/code&gt;. The most common mistake is using the wrong one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# fullchain.pem   — Use this: leaf certificate + intermediate(s) combined
# cert.pem        — Not this: leaf certificate only (no intermediate)
# chain.pem       — Intermediate certificate only
# privkey.pem     — Your private key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;In your web server config, always reference &lt;code&gt;fullchain.pem&lt;/code&gt; as your certificate file, not &lt;code&gt;cert.pem&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Nginx
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;443&lt;/span&gt; &lt;span class="s"&gt;ssl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;yourdomain.com&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate&lt;/span&gt;     &lt;span class="n"&gt;/etc/letsencrypt/live/yourdomain.com/fullchain.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_certificate_key&lt;/span&gt; &lt;span class="n"&gt;/etc/letsencrypt/live/yourdomain.com/privkey.pem&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_protocols&lt;/span&gt; &lt;span class="s"&gt;TLSv1.2&lt;/span&gt; &lt;span class="s"&gt;TLSv1.3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;ssl_ciphers&lt;/span&gt; &lt;span class="s"&gt;HIGH:!aNULL:!MD5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Apache
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight apache"&gt;&lt;code&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="sr"&gt; *:443&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="nc"&gt;ServerName&lt;/span&gt; yourdomain.com
    &lt;span class="nc"&gt;SSLEngine&lt;/span&gt; &lt;span class="ss"&gt;on&lt;/span&gt;
    &lt;span class="nc"&gt;SSLCertificateFile&lt;/span&gt;    /etc/letsencrypt/live/yourdomain.com/fullchain.pem
    &lt;span class="nc"&gt;SSLCertificateKeyFile&lt;/span&gt; /etc/letsencrypt/live/yourdomain.com/privkey.pem
&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nl"&gt;VirtualHost&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Caddy
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight vcl"&gt;&lt;code&gt;yourdomain.com &lt;span class="p"&gt;{&lt;/span&gt;
    reverse_proxy localhost:&lt;span class="mi"&gt;3000&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# If providing your own certificate manually:&lt;/span&gt;
yourdomain.com &lt;span class="p"&gt;{&lt;/span&gt;
    tls &lt;span class="o"&gt;/&lt;/span&gt;path&lt;span class="o"&gt;/&lt;/span&gt;to&lt;span class="o"&gt;/&lt;/span&gt;fullchain.pem &lt;span class="o"&gt;/&lt;/span&gt;path&lt;span class="o"&gt;/&lt;/span&gt;to&lt;span class="o"&gt;/&lt;/span&gt;privkey.pem
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  If using a paid CA (manual certificate)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Combine leaf and intermediate (leaf first, then intermediate)&lt;/span&gt;
&lt;span class="nb"&gt;cat &lt;/span&gt;yourdomain.crt intermediate.crt &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; fullchain.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After updating your config, reload your server and verify the fix with the &lt;a href="https://www.authgear.com/tools/ssl-checker" rel="noopener noreferrer"&gt;Authgear SSL Checker&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  How to Prevent Chain Issues
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Always use &lt;code&gt;fullchain.pem&lt;/code&gt;&lt;/strong&gt; when using Certbot — never reference &lt;code&gt;cert.pem&lt;/code&gt; alone.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test from a clean environment&lt;/strong&gt; — use the &lt;a href="https://www.authgear.com/tools/ssl-checker" rel="noopener noreferrer"&gt;Authgear SSL Checker&lt;/a&gt;, which always connects fresh without cached intermediates.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Test after every certificate change&lt;/strong&gt; — check the chain immediately after deploying, before closing the deployment window.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Set up expiry monitoring&lt;/strong&gt; — tools like UptimeRobot, Checkly, or Datadog can alert you before a certificate expires or the chain becomes invalid.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Frequently Asked Questions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  What is an SSL certificate chain?
&lt;/h3&gt;

&lt;p&gt;An SSL certificate chain is the sequence of digital certificates that links your website's certificate to a root Certificate Authority (CA) that browsers trust. The chain typically has three levels: your leaf certificate, one or more intermediate certificates, and a trusted root certificate.&lt;/p&gt;

&lt;h3&gt;
  
  
  How does an SSL certificate chain work?
&lt;/h3&gt;

&lt;p&gt;When a browser connects to your site, your server sends the leaf certificate plus any intermediate certificates. The browser walks the chain upward, verifying each certificate's signature, until it reaches a root certificate already in its trust store. If every link checks out, the connection is trusted. If the chain breaks anywhere, the browser shows a security error.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is the difference between a certificate and a certificate chain?
&lt;/h3&gt;

&lt;p&gt;A certificate is a single signed credential proving ownership of a domain or identity. A certificate chain is the full path from your certificate up to a trusted root, including every intermediate certificate that signed something below it. Browsers trust roots, not individual leaf certificates — the chain is what proves your certificate was issued by a trusted authority.&lt;/p&gt;

&lt;h3&gt;
  
  
  What does a certificate chain look like?
&lt;/h3&gt;

&lt;p&gt;When decoded with &lt;code&gt;openssl x509 -text&lt;/code&gt;, each certificate in the chain shows its subject (who it identifies), issuer (who signed it), validity dates, and signature algorithm. In a valid chain, the issuer of certificate N matches the subject of certificate N+1, all the way up to a self-signed root. See the decoded example above.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why is my certificate chain incomplete?
&lt;/h3&gt;

&lt;p&gt;The most common cause is referencing the wrong file in your web server config. With Certbot, use &lt;code&gt;fullchain.pem&lt;/code&gt; (leaf + intermediate) — not &lt;code&gt;cert.pem&lt;/code&gt; (leaf only). With a paid CA, you may need to manually concatenate the leaf and intermediate certificates into a single file before deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  What is fullchain.pem?
&lt;/h3&gt;

&lt;p&gt;&lt;code&gt;fullchain.pem&lt;/code&gt; is the file Certbot generates that contains your leaf certificate followed by every intermediate certificate, concatenated in PEM format. Always reference this file in your Nginx, Apache, or Caddy configuration — never &lt;code&gt;cert.pem&lt;/code&gt;, which is the leaf certificate alone and will produce a broken chain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Steps
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.authgear.com/tools/ssl-checker" rel="noopener noreferrer"&gt;Check your certificate chain&lt;/a&gt; with the free Authgear SSL Checker&lt;/li&gt;
&lt;li&gt;Learn the fundamentals in &lt;a href="https://www.authgear.com/post/what-is-ssl-certificate" rel="noopener noreferrer"&gt;What Is an SSL Certificate? A Developer's Guide&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Originally published at &lt;a href="https://www.authgear.com/post/ssl-certificate-chain" rel="noopener noreferrer"&gt;authgear.com&lt;/a&gt;. Authgear is an authentication platform for modern apps — passkeys, MFA, SSO, session management.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>security</category>
      <category>devops</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Testing HMAC Signatures Online — A Free Developer Tool</title>
      <dc:creator>Fung</dc:creator>
      <pubDate>Wed, 08 Oct 2025 16:21:39 +0000</pubDate>
      <link>https://forem.com/authgear/testing-hmac-signatures-online-a-free-developer-tool-51mk</link>
      <guid>https://forem.com/authgear/testing-hmac-signatures-online-a-free-developer-tool-51mk</guid>
      <description>&lt;p&gt;APIs often rely on HMAC signatures to verify the authenticity and integrity of requests.&lt;br&gt;
Whether you’re validating webhooks, securing IoT messages, or signing API payloads, it’s crucial to confirm that your HMAC implementation works correctly — and that both client and server generate the same signature.&lt;/p&gt;

&lt;p&gt;That’s where a free testing tool helps.&lt;/p&gt;
&lt;h2&gt;
  
  
  🔐 What Is an HMAC Signature?
&lt;/h2&gt;

&lt;p&gt;An &lt;em&gt;HMAC (Hash-based Message Authentication Code)&lt;/em&gt; is a unique signature generated by hashing a message with a secret key.&lt;br&gt;
If the message changes or the key is incorrect, the signature won’t match — protecting your API from tampering or replay attacks.&lt;/p&gt;

&lt;p&gt;Example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;HMAC = hash(secret_key + message)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Common algorithms: &lt;code&gt;SHA-256&lt;/code&gt;, &lt;code&gt;SHA-1&lt;/code&gt;, &lt;code&gt;SHA-512&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🧮 Why You Need to Test HMAC Signatures
&lt;/h2&gt;

&lt;p&gt;When integrating APIs, mismatched HMAC signatures are among the most common debugging issues.&lt;br&gt;
You might face:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Incorrect encoding (UTF-8 vs ASCII)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Mismatched algorithms (SHA1 vs SHA256)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Differences in message formatting&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Missing newline characters or whitespace&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Testing with a live HMAC tool helps quickly isolate these problems before they break production code.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧰 Free Tool: HMAC Signature Generator &amp;amp; Verifier
&lt;/h2&gt;

&lt;p&gt;You can instantly generate or verify HMAC signatures using this free tool:&lt;br&gt;&lt;br&gt;
👉 &lt;strong&gt;&lt;a href="https://www.authgear.com/tools/hmac-signature-generator-verifier" rel="noopener noreferrer"&gt;HMAC Signature Generator &amp;amp; Verifier — by Authgear&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Supports SHA-1, SHA-256, and SHA-512
&lt;/li&gt;
&lt;li&gt;“Generate” or “Verify” modes
&lt;/li&gt;
&lt;li&gt;Copy-to-clipboard output
&lt;/li&gt;
&lt;li&gt;Real-time hash calculation
&lt;/li&gt;
&lt;li&gt;No account or API key required
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;How to Use It:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Paste your message.
&lt;/li&gt;
&lt;li&gt;Enter your secret key.
&lt;/li&gt;
&lt;li&gt;Choose the hash algorithm (e.g., SHA-256).
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Generate&lt;/strong&gt; to get your signature — or switch to &lt;strong&gt;Verify&lt;/strong&gt; mode to compare an existing one.
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;It’s a simple way to confirm that your backend code is producing the same HMAC value you expect.&lt;/p&gt;

&lt;h2&gt;
  
  
  🧑‍💻 Quick Example in Node.js
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;crypto&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;message&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Authgear&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mysecretkey&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createHmac&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;sha256&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;secret&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;digest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;hex&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Generated HMAC:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;signature&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can paste your message and secret into the &lt;a href="https://www.authgear.com/tools/hmac-signature-generator-verifier" rel="noopener noreferrer"&gt;Authgear HMAC tool&lt;/a&gt; to verify the result instantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  🌐 Why Developers Use HMAC
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Lightweight and fast&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Works offline (no tokens or external verification)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Easy to implement in any language&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Still one of the most secure message verification methods in 2025&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>api</category>
      <category>security</category>
      <category>authgear</category>
      <category>developers</category>
    </item>
    <item>
      <title>SSO Simplified: Enhancing Security and User Experience</title>
      <dc:creator>Fung</dc:creator>
      <pubDate>Mon, 02 Sep 2024 05:27:52 +0000</pubDate>
      <link>https://forem.com/authgear/sso-simplified-enhancing-security-and-user-experience-43fe</link>
      <guid>https://forem.com/authgear/sso-simplified-enhancing-security-and-user-experience-43fe</guid>
      <description>&lt;p&gt;Single Sign-On (SSO) has become a cornerstone of modern digital authentication strategies. In essence, SSO allows users to access multiple applications and services with a single set of credentials, streamlining the user experience and enhancing security. For IT managers and technicians, implementing SSO effectively can significantly reduce password fatigue, minimize security risks, and improve overall productivity.&lt;/p&gt;

&lt;p&gt;This handbook article aims to provide a deep dive into SSO technologies, exploring various implementation scenarios, underlying mechanisms, and best practices. By the end of this guide, you'll be equipped with the knowledge to make informed decisions about SSO deployment in your organization.&lt;/p&gt;

&lt;h1&gt;
  
  
  1. Scenarios Where SSO is Needed
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1.1 Multi-app Ecosystem
&lt;/h2&gt;

&lt;p&gt;Large tech companies often operate diverse portfolios of applications and services. SSO plays a crucial role in unifying these ecosystems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Meta:&lt;/strong&gt; Facebook, Instagram, Messenger, and Threads form a tightly integrated social media ecosystem. Users can seamlessly switch between these platforms without re-authenticating, enhancing engagement and cross-platform interactions.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google:&lt;/strong&gt; The suite including Google Photos, Drive, Maps, and Home devices showcases how SSO can span both web and IoT environments. A single Google account provides access to a vast array of services, from productivity tools to smart home controls.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Uber:&lt;/strong&gt; By unifying Uber ride-hailing, UberEats food delivery, and the Uber Drivers app under a single authentication system, the company provides a cohesive experience for both customers and service providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In these ecosystems, SSO not only enhances user experience but also allows for more effective data sharing and personalization across services, while maintaining robust security protocols, even if the apps were all built by completely different teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.2 Spin-off Apps and Campaigns
&lt;/h2&gt;

&lt;p&gt;Enterprises frequently launch new initiatives that require rapid development and deployment. This often includes spin-off projects, and prototype testing of new product concepts. In such cases, Single Sign-On (SSO) can be a crucial tool.&lt;/p&gt;

&lt;p&gt;For marketing campaigns requiring quick web apps, SSO allows these temporary applications to securely use existing user bases. SSO also streamlines user onboarding for new ventures by tapping into the parent company’s user pool and facilitates prototype testing with a subset of existing users without creating new authentication systems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gws0go6ninbnw934bay.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6gws0go6ninbnw934bay.jpg" alt="SSO vs no-SSO" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sometimes, the development team of the core app may be too busy to respond quickly to requests for new initiatives, such as a web app for a marketing campaign. Having an SSO infrastructure in place can empower a small development and design team to iterate rapidly.&lt;/p&gt;

&lt;p&gt;By implementing SSO, organizations can maintain agility in launching new initiatives while ensuring that user data remains protected and consistent across all touchpoints.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.3 Super Apps with Mini Programs
&lt;/h2&gt;

&lt;p&gt;The concept of super apps, popularized in Asian markets, is gaining traction globally, with some popular examples including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;LINE/KakaoTalk:&lt;/strong&gt; These super apps incorporate messaging, social media, and a vast ecosystem of mini-programs, all accessible through a single login.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Gojek:&lt;/strong&gt; In Southeast Asia, Gojek offers ride-hailing, food delivery, news, and financial services within a single app.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Super apps can also be found within enterprise environments, where they offer significant advantages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Corporate Portals:&lt;/strong&gt; Instead of asking staff to install multiple different apps, an enterprise may package various internal tools into a single mobile app. This super app can include systems like HR, inventory management, and communication platforms, all built by different developers or business units.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Field Service Apps:&lt;/strong&gt; Companies with mobile workforces, such as maintenance or IT, can bundle multiple tools (scheduling, invoicing, knowledge bases) into one app with SSO. This approach provides employees with seamless access to all necessary resources in one place.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In both cases, services must be accessible on mobile platforms and web browsers. Delivering these services as web apps is cost-effective and ensures they are always up-to-date. However, implementing SSO in super apps presents unique challenges, particularly in managing session states across different mini-programs or web views.&lt;/p&gt;

&lt;p&gt;A secure SSO mechanism helps manage sessions across the app suite, allowing for smooth transitions between services while maintaining strict security boundaries. IT professionals must ensure seamless integration between various services to provide an efficient user experience and uphold high security standards.&lt;/p&gt;

&lt;h2&gt;
  
  
  1.4 App-to-App Authentication
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3i83vpsn9e7d4siuwea.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg3i83vpsn9e7d4siuwea.gif" alt="App2app Example" width="1600" height="900"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;App-to-app (app2app) authentication is becoming increasingly important in mobile ecosystems, as it offers a simpler and faster flow for authentication when the user has already installed and logged into another recognized app on their mobile device. Here are some key use cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Financial Services:&lt;/strong&gt; Banking apps can authorize fintech apps to access account information, streamlining processes like budgeting or investment management. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This integration allows users to seamlessly manage their finances across multiple platforms within a single application.&lt;/p&gt;

&lt;p&gt;Implementing app2app authentication requires careful consideration of security protocols, user consent mechanisms, and data sharing policies. IT managers must ensure compliance with regulations like GDPR or PSD2 when implementing these solutions.&lt;/p&gt;

&lt;h1&gt;
  
  
  2. How Sessions are Shared Between Services
&lt;/h1&gt;

&lt;h2&gt;
  
  
  2.1 Cookies
&lt;/h2&gt;

&lt;p&gt;Cookie-based SSO is one of the most straightforward and essential methods for authenticating users in web applications. It offers several advantages such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Domain-Level Sharing:&lt;/strong&gt; By configuring cookies at the root domain level &lt;em&gt;(e.g., .example.com)&lt;/em&gt;, all subdomains can access the same session information, making it easier to manage user sessions across multiple subdomains.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Secure and HttpOnly Flags:&lt;/strong&gt; These flags enhance security by restricting client-side access to cookies and ensuring that they are only transmitted over secure channels.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;SameSite Attribute:&lt;/strong&gt; This attribute helps mitigate cross-site request forgery (CSRF) attacks by controlling how cookies are included with cross-site requests.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2.2 Redirect Flow
&lt;/h2&gt;

&lt;p&gt;You tap &lt;em&gt;"Login"&lt;/em&gt; in an app, and it whisks you away to a familiar login page in your browser. After entering your credentials, you're seamlessly transported back to the app, now fully logged in. This smooth back-and-forth dance is known as the &lt;em&gt;"redirect flow"&lt;/em&gt; - a typical implementation of Single Sign-On (SSO) technology.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeo1af58x8qybzwl6csl.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmeo1af58x8qybzwl6csl.jpg" alt="Redirect Flow" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This seamless experience extends across multiple apps. When a new app redirects you to the same login page, you'll often find your session is still active. With just a quick &lt;em&gt;"Continue"&lt;/em&gt; tap, you're in - no need to re-enter your credentials. &lt;/p&gt;

&lt;p&gt;The redirect flow is crucial for implementing SSO in cross-platform applications and requires secure token exchange mechanisms such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;OAuth 2.0 and OpenID Connect:&lt;/strong&gt; These protocols standardize the authorization and authentication processes, allowing for secure token exchange.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;State Parameter:&lt;/strong&gt; This prevents CSRF attacks by ensuring the request's integrity throughout the redirect process.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;PKCE (Proof Key for Code Exchange):&lt;/strong&gt; An additional security layer for mobile and single-page applications to prevent interception of the authorization code.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here’s an example flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;User&lt;/strong&gt; clicks &lt;em&gt;"Login"&lt;/em&gt; in App A&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App A&lt;/strong&gt; redirects to centralized auth server with &lt;code&gt;client_id&lt;/code&gt; and &lt;code&gt;redirect_uri&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;User&lt;/strong&gt; authenticates on auth server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Auth server&lt;/strong&gt; redirects back to App A with an authorization code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App A&lt;/strong&gt; exchanges code for access and refresh tokens&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;App A&lt;/strong&gt; can now make authenticated API calls&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Implementing this flow requires careful coordination between the client application, authorization server, and resource server to ensure secure token handling and validation.&lt;/p&gt;

&lt;h2&gt;
  
  
  2.3 Shared Container
&lt;/h2&gt;

&lt;p&gt;Imagine this: You download the new shiny app Google just released, and it instantly opens to your personalized dashboard without asking you to log in or provide details. No email entry, no password prompt — just immediate access. &lt;em&gt;Real-life magic.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This is where shared containers come in.&lt;/p&gt;

&lt;p&gt;Shared containers provide a native SSO experience on mobile platforms:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;iOS Keychain and App Groups:&lt;/strong&gt; Allow secure sharing of credentials between apps from the same developer.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Android AccountManager:&lt;/strong&gt; Provides a centralized registry of user credentials that can be securely accessed by authorized apps.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This example demonstrates how to securely store and retrieve authentication tokens using the iOS Keychain, which can be shared between apps from the same developer.&lt;/p&gt;

&lt;h1&gt;
  
  
  3. Choosing the Right SSO Approach
&lt;/h1&gt;

&lt;p&gt;Selecting the appropriate SSO method depends on various factors:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqd1br6qht4s9xkzhz89.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feqd1br6qht4s9xkzhz89.jpg" alt="SSO Decision Flowchart" width="800" height="550"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Platform Diversity:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Web-only:&lt;/strong&gt; For non-SPA websites, consider &lt;strong&gt;cookie-based solutions&lt;/strong&gt;. For other applications requiring web-specific SSO protocols you can consider using &lt;strong&gt;redirect flow&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mixed (Web and Mobile):&lt;/strong&gt; Implement &lt;strong&gt;OAuth 2.0 with OpenID Connect&lt;/strong&gt; for a standardized approach across platforms.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mobile-only:&lt;/strong&gt; Utilize platform-specific shared containers or &lt;strong&gt;app2app authentication&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Security Requirements:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;High-security environments may require additional factors like biometrics or hardware tokens.&lt;/li&gt;
&lt;li&gt;Consider implementing FIDO2 standards for passwordless authentication.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;User Experience:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Evaluate the trade-off between security and convenience.&lt;/li&gt;
&lt;li&gt;Consider implementing step-up authentication for sensitive operations.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Regulatory Compliance:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensure your SSO solution adheres to relevant standards (&lt;em&gt;e.g., GDPR, HIPAA, PSD2&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Implement appropriate consent and data sharing mechanisms.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Scalability:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose solutions that can grow with your user base and application ecosystem.&lt;/li&gt;
&lt;li&gt;Consider &lt;a href="https://authgear.com/" rel="noopener noreferrer"&gt;cloud-based identity providers&lt;/a&gt; for easier management and scalability.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Taking a thoughtful approach to these considerations will not only enhance security but also streamline access across diverse platforms, ultimately supporting a seamless and efficient user experience.&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusion
&lt;/h1&gt;

&lt;p&gt;Implementing SSO effectively requires a deep understanding of various technologies and careful consideration of your organization's specific needs. By leveraging the right combination of cookies, redirect flows, shared containers, and app2app authentication, you can create a seamless and secure authentication experience across your entire digital ecosystem.&lt;/p&gt;

&lt;p&gt;As you move forward with your SSO implementation, remember to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;u&gt;Regularly audit your authentication systems for security vulnerabilities.&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Stay informed about emerging authentication standards and best practices.&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Collect and analyze user feedback to continuously improve the login experience.&lt;/u&gt;&lt;/li&gt;
&lt;li&gt;&lt;u&gt;Plan for future expansion of your application ecosystem and how it will integrate with your SSO solution.&lt;/u&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By following these guidelines and choosing the appropriate SSO methods for your use cases, you can significantly enhance both the security and usability of your organization's digital services.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This article is part of a multi-part handbook. If you're interested, follow for more upcoming posts about SSO or join our &lt;a href="https://discord.gg/FRwNvkdkrf" rel="noopener noreferrer"&gt;auth-oriented community&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>sso</category>
      <category>learning</category>
      <category>cybersecurity</category>
      <category>ux</category>
    </item>
  </channel>
</rss>
