grazulex / laravel-oneclicklogin
Passwordless authentication via magic links for Laravel applications - secure, single-use, time-limited URLs for seamless user login.
Fund package maintenance!
Grazulex
paypal.me/strauven
Requires
- php: ^8.3
- illuminate/support: ^11.0|^12.0
- nesbot/carbon: ^3.10
- symfony/yaml: ^7.3
Requires (Dev)
- doctrine/dbal: ^4.2
- larastan/larastan: ^3.4
- laravel/pint: 1.24.0
- orchestra/testbench: ^9.0|^10.0
- pestphp/pest: ^3.8
- pestphp/pest-plugin-laravel: ^3.2
- rector/rector: ^2.0
README

Passwordless authentication via magic links for Laravel applications - secure, single-use, time-limited URLs for seamless user login.
A powerful Laravel package for creating passwordless authentication with comprehensive security features and audit trails.
๐ Overview
Laravel OneClickLogin is a comprehensive package for implementing passwordless authentication in your Laravel applications. Perfect for creating secure, time-limited magic links that provide seamless user login without passwords, with complete audit trails and advanced security features.
โจ Key Features
- ๐ Passwordless Authentication - Replace or complement password-based login
- โฐ Time-Limited Access - Set expiration dates and usage limits
- ๐ Security-by-Default - Signed, hashed tokens with short expirations
- ๐ซ Rate Limiting - Per-email and per-IP rate limiting to prevent abuse
- ๐ IP & Device Binding - Optional IP address and device fingerprint binding
- ๐ Signed URLs - Laravel signed route integration for additional security
- ๐ฅ Single-Use Links - Magic links that expire after first successful use
- ๐ Comprehensive Auditing - Track access patterns, IPs, and timestamps
- ๐ก๏ธ Advanced Security - OTP step-up authentication for suspicious devices
- ๐ญ MultiPersona Integration - Include persona/tenant/role context in links
- ๐ง Flexible Delivery - Support for email, SMS, and custom notification channels
- ๐ Management API - Revoke and extend links programmatically
- ๐จ CLI Commands - Full Artisan command support
- ๏ฟฝ Observability - Built-in logging and metrics integration
- ๐ ShareLink Integration - Optional delivery layer with analytics and audit trails
- ๐งช Test-Friendly - Comprehensive test coverage with easy mocking
๐ฆ Installation
Install the package via Composer:
composer require grazulex/laravel-oneclicklogin
Publish and run the migrations:
php artisan vendor:publish --tag="oneclicklogin-migrations"
php artisan migrate
Optionally, publish the configuration file:
php artisan vendor:publish --tag="oneclicklogin-config"
๐ก Auto-Discovery: The service provider will be automatically registered thanks to Laravel's package auto-discovery.
โก Quick Start
๐ Need more examples? Check out our Examples Gallery for e-commerce, SPA, and multi-tenant scenarios.
๐ Basic Usage
use Grazulex\OneClickLogin\Facades\OneClickLogin; // Send a magic link with expiration $link = OneClickLogin::to($user) ->via('mail') ->expireIn(15) // 15 minutes ->withContext(['redirect' => '/dashboard']) ->send(); echo $link->getSignedUrl(); // https://yourapp.com/login/magic?token=abc123xyz
๐ง Email Magic Links
// Send via email with custom context OneClickLogin::to($user) ->via('mail') ->expireIn(30) // 30 minutes ->maxUses(1) ->withContext([ 'redirect' => '/profile', 'remember' => true ]) ->send();
๐ฑ SMS Magic Links
// Send via SMS OneClickLogin::to($user) ->via('sms') ->expireIn(10) // 10 minutes ->withContext(['redirect' => '/mobile-dashboard']) ->send();
๐ญ MultiPersona Integration
// Magic link with persona context OneClickLogin::to($user) ->via('mail') ->expireIn(30) ->withContext([ 'persona' => 'client', 'tenant' => 123, 'role' => 'admin', 'redirect'=> '/admin/dashboard', 'remember'=> true ]) ->bindIp() // Optional IP binding ->bindDevice($request) // Optional device binding ->send();
๐ฅ Advanced Security Features
// Secure magic link with IP restrictions and OTP step-up OneClickLogin::to($user) ->via('mail') ->expireIn(15) ->bindIp() // Bind to current IP ->bindDevice($request) // Bind to device fingerprint ->withContext([ 'redirect' => '/secure-area', 'otp_required' => true // Require OTP for suspicious access ]) ->send(); // Create without sending for custom delivery $link = OneClickLogin::create($user, [ 'ttl' => 30, 'context' => ['redirect' => '/billing'], ]);
๐ง Requirements
โข PHP 8.3+ โข Laravel 11.0+ | 12.0+
๐ Compatibility Matrix: See our Installation Guide for detailed Laravel/PHP compatibility.
๐ Complete Documentation
For comprehensive documentation, examples, and advanced usage guides, visit our Wiki:
๐ ๐ Laravel OneClickLogin Wiki
The wiki includes:
- ๐ Installation & Setup
- โ๏ธ Configuration
- ๐ฏ Quick Start Guide
- ๐ Link Creation Options
- ๐ API Reference
- โจ๏ธ Console Commands
- ๏ฟฝ Examples
- ๐ง Troubleshooting
- โ FAQ
๐จ Artisan Commands
Laravel OneClickLogin includes powerful CLI commands for managing your magic links:
# Send a magic link php artisan oneclicklogin:send user@example.com --via=mail --ttl=15 # List all magic links php artisan oneclicklogin:list --active --expired # Revoke a specific link php artisan oneclicklogin:revoke abc123xyz # Clean up expired links php artisan oneclicklogin:prune --days=7 # Test magic link generation php artisan oneclicklogin:test user@example.com
๐ง Configuration
The package comes with sensible defaults, but you can customize everything:
// config/oneclicklogin.php return [ 'ttl_minutes' => 15, 'max_uses' => 1, 'guard' => 'web', 'security' => [ 'ip_binding' => false, 'device_binding' => false, 'enable_otp_step_up' => false, 'hash_algorithm' => 'sha256', 'signed_urls' => true, ], 'rate_limit' => [ 'issue_per_email_per_hour' => 5, 'consume_per_ip_per_min' => 20, ], 'multi_persona' => [ 'enabled' => true, 'keys' => ['persona', 'tenant', 'role'], ], ];
๐ง Troubleshooting
Common Issue: API vs CLI Discrepancy
If OneClickLogin::for()->generate()
fails but CLI commands work, this is typically an environment setup issue, not a package bug:
# Quick fix - ensure clean environment php artisan migrate:fresh php artisan cache:clear php artisan config:clear # Then test php artisan tinker >>> OneClickLogin::for('test@example.com')->generate();
For testing, always use RefreshDatabase
:
use Illuminate\Foundation\Testing\RefreshDatabase; class YourTest extends TestCase { use RefreshDatabase; // โ Prevents environment issues }
๐ Full troubleshooting guide: Wiki Troubleshooting
๐งช Testing
composer test
๐ค Contributing
Please see the Contributing Guide for details.
๐ Security
If you discover any security-related issues, please email jms@grazulex.be instead of using the issue tracker.
๐ Changelog
Please see the Changelog for more information on what has changed recently.
๐ License
The MIT License (MIT). Please see License File for more information.
๐ฅ Credits
โข Jean-Marc Strauven โข All Contributors
๐ฌ Support
โข ๐ Report Issues โข ๐ฌ Discussions โข ๐ Documentation
Laravel OneClickLogin - Passwordless authentication for Laravel applications with comprehensive security features and audit trails.