<?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>DEV Community: Hamdy ELbatal</title>
    <description>The latest articles on DEV Community by Hamdy ELbatal (@hamdyelbatal122).</description>
    <link>https://dev.to/hamdyelbatal122</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%2Fuser%2Fprofile_image%2F3909857%2Facd2b03f-bb28-4e95-8caf-a1e2532d905c.png</url>
      <title>DEV Community: Hamdy ELbatal</title>
      <link>https://dev.to/hamdyelbatal122</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hamdyelbatal122"/>
    <language>en</language>
    <item>
      <title>Vaultic: WebAuthn Authentication for Laravel – The Death of Passwords</title>
      <dc:creator>Hamdy ELbatal</dc:creator>
      <pubDate>Sun, 03 May 2026 05:55:51 +0000</pubDate>
      <link>https://dev.to/hamdyelbatal122/vaultic-webauthn-authentication-for-laravel-the-death-of-passwords-4mk0</link>
      <guid>https://dev.to/hamdyelbatal122/vaultic-webauthn-authentication-for-laravel-the-death-of-passwords-4mk0</guid>
      <description>&lt;h1&gt;
  
  
  Vaultic: WebAuthn Authentication for Laravel
&lt;/h1&gt;

&lt;h2&gt;
  
  
  The Death of Passwords is Here
&lt;/h2&gt;

&lt;p&gt;** Passwords are dead.**&lt;/p&gt;

&lt;p&gt;We all know it. You know it. Your users know it. Yet here we are in 2026, still storing password hashes like it's 2016.&lt;/p&gt;

&lt;p&gt;The future is passwordless. And it's not coming—&lt;strong&gt;it's already here.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But implementing &lt;strong&gt;WebAuthn (FIDO2)&lt;/strong&gt; is a nightmare: challenges, assertions, public-key cryptography, browser compatibility... the complexity is overwhelming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Until now.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;&lt;a href="https://github.com/hamdyelbatal122/vaultic" rel="noopener noreferrer"&gt;Vaultic&lt;/a&gt;&lt;/strong&gt;: a production-ready WebAuthn/Passkeys package for Laravel that makes passwordless authentication as simple as installing a composer package.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Face ID. Touch ID. Windows Hello. Security Keys.&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
All working in your Laravel app. Today.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  Why Should You Care About Passkeys?
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Problem with Passwords
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Issue&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🔓 &lt;strong&gt;Phishing&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Users fall for fake login prompts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔑 &lt;strong&gt;Reuse&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Same password across 100 sites&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;💥 &lt;strong&gt;Breaches&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;33 billion passwords leaked in 2024&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📞 &lt;strong&gt;Support Cost&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Password resets waste admin time&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;😤 &lt;strong&gt;UX Pain&lt;/strong&gt;
&lt;/td&gt;
&lt;td&gt;Users hate remembering passwords&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Why Passkeys Win
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;🛡️  Phishing-proof      → Keys locked to YOUR domain only
📱  Biometric-first     → Face ID, Touch ID, Windows Hello
⚡  Lightning fast       → Tap instead of typing
🔐  Cryptographically   → FIDO2 standard (unbreakable)
    secure
🌍  Universal support   → All modern browsers, all platforms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The result?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Companies switching to passkeys report:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📉 &lt;strong&gt;50% fewer&lt;/strong&gt; password reset tickets&lt;/li&gt;
&lt;li&gt;⚡ &lt;strong&gt;90% faster&lt;/strong&gt; login experience&lt;/li&gt;
&lt;li&gt;🚫 &lt;strong&gt;~0% phishing&lt;/strong&gt; attacks (keys can't be stolen)&lt;/li&gt;
&lt;li&gt;😊 &lt;strong&gt;Higher&lt;/strong&gt; user satisfaction&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  What is Vaultic?
&lt;/h2&gt;

&lt;p&gt;Vaultic is a &lt;strong&gt;Laravel package&lt;/strong&gt; that abstracts away all the WebAuthn complexity. Think of it as the Rails framework for passkeys—you don't write boilerplate, you just ship.&lt;/p&gt;
&lt;h3&gt;
  
  
  Feature Checklist
&lt;/h3&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;Status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;🎯 Multi-guard support (web + API)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📱 Stateful + stateless flows&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🎨 Pre-built Blade components&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📊 Activity tracking (last login, IP, device)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Fallback authentication&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Laravel Sanctum integration&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Zero configuration needed&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔧 Custom WebAuthn verifier&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;📚 Comprehensive tests&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🏆 Battle-tested (19+ releases)&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;


&lt;h2&gt;
  
  
  ⚡ Quick Start: Passkeys in 5 Minutes
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1️⃣: Install
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require hamzi/vaultic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 2️⃣: Publish Assets &amp;amp; Migrate
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;php artisan vendor:publish &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Hamzi&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Vaultic&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;VaulticServiceProvider"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vaultic-config
php artisan vendor:publish &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Hamzi&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Vaultic&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;VaulticServiceProvider"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vaultic-migrations
php artisan vendor:publish &lt;span class="nt"&gt;--provider&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"Hamzi&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;Vaultic&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;VaulticServiceProvider"&lt;/span&gt; &lt;span class="nt"&gt;--tag&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;vaultic-views
php artisan migrate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h3&gt;
  
  
  Step 3️⃣: Add Button to Your Login
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Blade:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;x-vaultic::passkey-button size="md" :full-width="true" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 4️⃣: 🎉 Done!
&lt;/h3&gt;

&lt;p&gt;Your users can now register and log in with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;👤 Face ID&lt;/li&gt;
&lt;li&gt;👆 Touch ID
&lt;/li&gt;
&lt;li&gt;🪟 Windows Hello&lt;/li&gt;
&lt;li&gt;🔑 Security Keys&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;That's it. No WebAuthn knowledge required.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ Architecture: How It Works
&lt;/h2&gt;

&lt;p&gt;Vaultic uses a clean, layered architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────┐
│  HTTP Layer                     │
│  (Controllers + Middleware)     │
└────────────┬────────────────────┘
             │
┌────────────▼────────────────────┐
│  Service Layer                  │
│  (WebAuthn Orchestration)       │
└────────────┬────────────────────┘
             │
┌────────────▼────────────────────┐
│  Repository Layer               │
│  (Passkey Persistence)          │
└────────────┬────────────────────┘
             │
┌────────────▼────────────────────┐
│  Eloquent Models                │
│  (Database)                     │
└─────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Clean separation of concerns.&lt;/strong&gt; Easy to test. Easy to extend.&lt;/p&gt;




&lt;h2&gt;
  
  
  💼 Real-World Example: Multi-Guard Setup
&lt;/h2&gt;

&lt;p&gt;Your app has both a &lt;strong&gt;web UI&lt;/strong&gt; (Blade) and an &lt;strong&gt;API&lt;/strong&gt; (Sanctum). Vaultic handles both with one package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="c1"&gt;// config/vaultic.php&lt;/span&gt;
&lt;span class="s1"&gt;'auth'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'guards'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="c1"&gt;// 🌐 Web Login&lt;/span&gt;
        &lt;span class="s1"&gt;'web'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'guard'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'web'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'provider_model'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'identifier_column'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="c1"&gt;// 📱 API Auth&lt;/span&gt;
        &lt;span class="s1"&gt;'api'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
            &lt;span class="s1"&gt;'guard'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'sanctum'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'provider_model'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;App\Models\User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'identifier_column'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'email'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="s1"&gt;'token_issuer'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;Hamzi\Vaultic\Services\SanctumApiTokenIssuer&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="p"&gt;],&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;p&gt;&lt;strong&gt;The flow:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;🌐 &lt;strong&gt;Web user&lt;/strong&gt; → taps passkey button → gets session → redirects to dashboard&lt;/li&gt;
&lt;li&gt;📱 &lt;strong&gt;Mobile client&lt;/strong&gt; → sends public key → gets Sanctum token → calls API&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Both use the &lt;strong&gt;same passkey database&lt;/strong&gt;. No duplication. No complexity.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎁 Key Features Deep Dive
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1️⃣ Passkey Management Panel
&lt;/h3&gt;

&lt;p&gt;Let users manage their own passkeys:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;x-vaultic::passkey-panel /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📋 List of linked authenticators (iPhone, Yubikey, Windows Hello, etc.)&lt;/li&gt;
&lt;li&gt;🕐 Last used timestamp&lt;/li&gt;
&lt;li&gt;🌍 Last used IP address&lt;/li&gt;
&lt;li&gt;🗑️ One-click delete for lost devices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Transparency = Trust.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2️⃣ Activity Logging &amp;amp; Security Events
&lt;/h3&gt;

&lt;p&gt;Listen to security events:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;Event&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;PasskeyAuthenticated&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Log&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;info&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'User authenticated with passkey'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="s1"&gt;'user_id'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="s1"&gt;'ip'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;ip&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
        &lt;span class="s1"&gt;'device'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;$event&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;passkey&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;metadata&lt;/span&gt;&lt;span class="p"&gt;,&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;p&gt;Events available:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;PasskeyRegistered&lt;/code&gt; — New key added&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;PasskeyAuthenticated&lt;/code&gt; — User logged in&lt;/li&gt;
&lt;li&gt;❌ &lt;code&gt;AuthenticationFailed&lt;/code&gt; — Attack detected&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3️⃣ Rate Limiting (Built-In)
&lt;/h3&gt;

&lt;p&gt;Protection against brute force attacks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'rate_limit'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'attempts'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="s1"&gt;'decay_seconds'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;60&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;p&gt;After 10 failed attempts → locked out for 60 seconds.&lt;/p&gt;

&lt;h3&gt;
  
  
  4️⃣ Fallback Authentication
&lt;/h3&gt;

&lt;p&gt;If passkey fails (lost device, browser doesn't support):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'fallback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;// or 'otp' or custom&lt;/span&gt;
&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Users can fall back to password or recovery codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  5️⃣ Custom WebAuthn Verifier
&lt;/h3&gt;

&lt;p&gt;Use your own FIDO2 library (Duo, Yubico, etc.):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;bind&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nc"&gt;Hamzi\Vaultic\Contracts\WebAuthnVerifier&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nc"&gt;App\Security\CustomWebAuthnVerifier&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;class&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No vendor lock-in.&lt;/strong&gt; Total flexibility.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔌 API Endpoints for Custom UIs
&lt;/h2&gt;

&lt;p&gt;Vaultic exposes clean JSON endpoints:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;📝 Registration
  POST /passkeys/register/options      → Get challenge
  POST /passkeys/register              → Save passkey

🔓 Authentication
  POST /passkeys/authenticate/options  → Get challenge
  POST /passkeys/authenticate          → Log in &amp;amp; get token

🗑️ Management
  DELETE /passkeys/{passkey}           → Remove passkey
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All JSON responses. Build custom UIs with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚛️ React / Vue / Svelte&lt;/li&gt;
&lt;li&gt;📱 Native iOS / Android&lt;/li&gt;
&lt;li&gt;🤖 Headless systems&lt;/li&gt;
&lt;li&gt;🌐 Custom frontends&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌍 Browser &amp;amp; Device Support
&lt;/h2&gt;

&lt;p&gt;Vaultic works everywhere:&lt;/p&gt;

&lt;h3&gt;
  
  
  Platform Authenticators
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🍎 &lt;strong&gt;iOS/macOS&lt;/strong&gt;: Face ID, Touch ID&lt;/li&gt;
&lt;li&gt;🪟 &lt;strong&gt;Windows&lt;/strong&gt;: Windows Hello (face, fingerprint, PIN)&lt;/li&gt;
&lt;li&gt;🐧 &lt;strong&gt;Linux&lt;/strong&gt;: Fingerprint readers&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cross-Device Auth
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;📱 &lt;strong&gt;Phone as Security Key&lt;/strong&gt;: Via Bluetooth (tap on your iPhone to unlock your Mac)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Hardware Keys
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;🔑 &lt;strong&gt;Yubikey&lt;/strong&gt;, &lt;strong&gt;Google Titan&lt;/strong&gt;, &lt;strong&gt;Ledger&lt;/strong&gt; (USB/NFC/BLE)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Vaultic is configured to prefer discoverable credentials&lt;/strong&gt;, meaning:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;No username entry needed&lt;/li&gt;
&lt;li&gt;Browser handles biometric prompt&lt;/li&gt;
&lt;li&gt;Seamless UX on all devices&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📦 Browser Compatibility
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Browser&lt;/th&gt;
&lt;th&gt;WebAuthn Support&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;✅ Chrome 67+&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Firefox 60+&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Safari 13+&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Edge 18+&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;✅ Opera 54+&lt;/td&gt;
&lt;td&gt;Full support&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Bottom line&lt;/strong&gt;: If your users are on modern browsers (which they are), passkeys work everywhere.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Deployment Checklist
&lt;/h2&gt;

&lt;p&gt;Before shipping to production:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ &lt;code&gt;APP_URL&lt;/code&gt; is correct (WebAuthn is domain-locked)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;CACHE_DRIVER&lt;/code&gt; configured (file, Redis, etc.)&lt;/li&gt;
&lt;li&gt;✅ Trusted proxies set (if behind load balancer)&lt;/li&gt;
&lt;li&gt;✅ &lt;code&gt;composer test&lt;/code&gt; passes&lt;/li&gt;
&lt;li&gt;✅ Tested on real devices&lt;/li&gt;
&lt;li&gt;✅ Event listeners configured&lt;/li&gt;
&lt;li&gt;✅ Fallback auth tested&lt;/li&gt;
&lt;li&gt;✅ Security.md policy in place&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📊 Real Impact Numbers
&lt;/h2&gt;

&lt;p&gt;Companies that switched to passkeys:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Impact&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;📞 Support tickets&lt;/td&gt;
&lt;td&gt;⬇️ 50% fewer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚡ Login speed&lt;/td&gt;
&lt;td&gt;⬇️ 90% faster&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔓 Phishing attacks&lt;/td&gt;
&lt;td&gt;⬇️ ~0%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;😊 User satisfaction&lt;/td&gt;
&lt;td&gt;⬆️ Significantly higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Security incidents&lt;/td&gt;
&lt;td&gt;⬇️ Nearly zero&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  ❓ FAQ: Your Questions Answered
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Q: "What if a user loses their device?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Vaultic supports fallback auth. Configure:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="s1"&gt;'fallback'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'driver'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'password'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lost device? Fall back to password or recovery codes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q: "Will my users actually use passkeys?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Yes. When users see a biometric login option, they &lt;strong&gt;prefer it&lt;/strong&gt;. No friction = instant adoption.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q: "Is it production-ready?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; 100%. Vaultic has 19+ releases, comprehensive tests, and follows Laravel standards (CONTRIBUTING.md, SECURITY.md, CODE_OF_CONDUCT.md).&lt;/p&gt;

&lt;h3&gt;
  
  
  Q: "Can I keep passwords alongside passkeys?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Yes. Passkeys are &lt;strong&gt;optional&lt;/strong&gt;, not forced. You can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Offer passkeys as an option&lt;/li&gt;
&lt;li&gt;Keep password login alongside&lt;/li&gt;
&lt;li&gt;Gradually migrate users&lt;/li&gt;
&lt;li&gt;Monitor adoption via events&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Q: "What about old browsers?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Use fallback auth. Gracefully degrade to passwords if WebAuthn not supported.&lt;/p&gt;

&lt;h3&gt;
  
  
  Q: "How does this affect my auth flow?"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A:&lt;/strong&gt; Minimal changes. Vaultic integrates seamlessly with Laravel's auth system.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 The Future is Passwordless
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;2023: Apple, Google, Microsoft announce passkey support&lt;/li&gt;
&lt;li&gt;2024: Enterprise adoption accelerates&lt;/li&gt;
&lt;li&gt;2025: Passkeys become mainstream&lt;/li&gt;
&lt;li&gt;2026: Passwords are legacy (where we are now)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Your Laravel app doesn't need to wait for the future—&lt;strong&gt;you can move to passwordless authentication today.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Getting Started (3 Steps)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Read the Documentation
&lt;/h3&gt;

&lt;p&gt;👉 &lt;a href="https://github.com/hamdyelbatal122/vaultic" rel="noopener noreferrer"&gt;github.com/hamdyelbatal122/vaultic&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Install the Package
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;composer require hamzi/vaultic
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Add a Button
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;&amp;lt;x-vaultic::passkey-button /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's it.&lt;/strong&gt; Users can register and log in with passkeys.&lt;/p&gt;




&lt;h2&gt;
  
  
  💚 Support Vaultic
&lt;/h2&gt;

&lt;p&gt;If Vaultic helps your project:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ &lt;strong&gt;Star the repo&lt;/strong&gt;: &lt;a href="https://github.com/hamdyelbatal122/vaultic" rel="noopener noreferrer"&gt;github.com/hamdyelbatal122/vaultic&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;💬 &lt;strong&gt;Share your experience&lt;/strong&gt;: Tweet us or comment below&lt;/li&gt;
&lt;li&gt;🐛 &lt;strong&gt;Report issues&lt;/strong&gt;: Help us improve&lt;/li&gt;
&lt;li&gt;📖 &lt;strong&gt;Contribute docs&lt;/strong&gt;: Better docs = more users&lt;/li&gt;
&lt;li&gt;💰 &lt;strong&gt;Sponsor&lt;/strong&gt;: &lt;a href="https://github.com/sponsors/hamdyelbatal122" rel="noopener noreferrer"&gt;GitHub Sponsors&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Open source thrives on community support. Every star, every issue, every contribution matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤝 Join the Passwordless Future
&lt;/h2&gt;

&lt;p&gt;The password era is ending. Passkeys are the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vaultic makes the transition seamless.&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  📚 Further Reading
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://fidoalliance.org/" rel="noopener noreferrer"&gt;FIDO2 Spec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/API/Web_Authentication_API" rel="noopener noreferrer"&gt;WebAuthn MDN Docs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://laravel.com/docs/authentication" rel="noopener noreferrer"&gt;Laravel Authentication&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/hamdyelbatal122/vaultic" rel="noopener noreferrer"&gt;Vaultic GitHub&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;strong&gt;Questions? Drop them in the comments below.&lt;/strong&gt; 👇&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Share this post if you found it helpful.&lt;/strong&gt; 🚀&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>webauthn</category>
      <category>passkeys</category>
      <category>security</category>
    </item>
  </channel>
</rss>
