laravel/breeze
Laravel Breeze is a lightweight starter kit for Laravel 11.x and earlier, providing simple authentication scaffolding to kickstart new apps quickly. For the latest official Laravel starter kits, see https://laravel.com/starter-kits.
Run the installer to scaffold authentication:
composer require laravel/breeze --dev
php artisan breeze:install
Choose your preferred stack (Blade, Inertia/Vue, Livewire, or API). For Blade, run:
php artisan breeze:install blade
Then install dependencies:
npm install && npm run dev
First use case: Test the auth flow by visiting /login, registering a user, and verifying email functionality.
Authentication Routes & Controllers
routes/auth.php (Blade) or routes/web.php (Inertia/Livewire).app/Http/Controllers/Auth/...) handle registration, login, password reset, and email verification.AuthController or RegisteredUserController for custom logic (e.g., add fields to registration).Views & Components
resources/views/auth/ (e.g., login.blade.php).resources/js/Pages/Auth/ (e.g., Login.tsx).app/Http/Livewire/Auth/ (e.g., Login.php).@extends or layout props.Middleware
auth, guest) is auto-registered in app/Http/Kernel.php.auth group:
'auth' => [
\App\Http\Middleware\VerifyCustomRole::class,
],
Session & State
app/Http/Middleware/HandleInertiaRequests.php is configured.config/cors.php.Testing
tests/Feature/Auth/.AuthenticationTestCase for custom assertions:
use Tests\TestCase;
use Laravel\Breeze\AuthenticationTestCase;
class CustomAuthTest extends AuthenticationTestCase {
// Override methods like `login()` or `register()`
}
Custom User Model/Fields:
Modify app/Models/User.php and update the migration. Re-run:
php artisan migrate:fresh
Update validation in app/Http/Requests/Auth/RegisterRequest.php.
Socialite Providers:
Install laravel/socialite and configure in config/services.php. Extend SocialAuthController:
use Laravel\Socialite\Facades\Socialite;
public function redirectToProvider($provider) {
return Socialite::driver($provider)->redirect();
}
Multi-Factor Auth (MFA):
Use laravel/breeze-two-factor or integrate laravel/fortify for advanced MFA.
API Stack:
Sanctum tokens are stored in the personal_access_tokens table. Use:
use Laravel\Sanctum\PersonalAccessToken;
$token = PersonalAccessToken::createToken('token-name');
CSRF Token Mismatch (Blade/Inertia)
CSRF token mismatch.@csrf is in Blade forms or Ziggy is configured for Inertia:
// resources/js/app.js
import { createInertiaApp } from '@inertiajs/react';
createInertiaApp({
resolve: (name) => require(`./Pages/${name}.tsx`),
setup({ el, App, props }) {
return createRoot(el).render(<App {...props} />);
},
});
Livewire Validation Errors
wire:model and wire:ignore are correctly set in Livewire components. Check app/Http/Livewire/Auth/Login.php for validation rules.Inertia SSR Hydration Mismatches
Hydration failed during SSR.dangerouslySetInnerHTML for dynamic content or disable SSR for specific pages:
// resources/js/Pages/Auth/Login.tsx
const { children, ...props } = usePageProps<PageProps>();
return <AuthLayout {...props}>{children}</AuthLayout>;
Email Verification Stuck in Queue
config/mail.php and queue worker:
php artisan queue:work
Mailable classes (e.g., VerifyEmail.php) are in app/Mail.Tailwind Dark Mode Conflicts
tailwind.config.js includes:
darkMode: 'class',
resources/css/app.css.Log Auth Events:
Use Laravel’s auth listeners in app/Providers/AuthServiceProvider.php:
public function boot() {
Auth::authenticated(function ($user) {
Log::info("User logged in: {$user->email}");
});
}
Dump Request Data:
Add to app/Http/Middleware/HandleInertiaRequests.php (Inertia):
public function share(Request $request): array {
return array_merge(parent::share($request), [
'debug' => $request->user()?->toArray(),
]);
}
Test API Tokens: Use Tinker to inspect Sanctum tokens:
php artisan tinker
>>> \App\Models\User::first()->createToken('test-token')->plainTextToken
Custom Auth Logic:
app/Http/Controllers/Auth/RegisteredUserController.php).// app/Http/Requests/Auth/RegisterRequest.php
public function rules() {
return [
'name' => 'required|string|max:255',
'email' => 'required|email|unique:users',
'password' => 'required|confirmed|min:8',
'premium' => 'sometimes|boolean', // Custom field
];
}
Modify Views:
resources/views/auth/login.blade.php to your project and customize.Login.tsx:
// resources/js/Pages/Auth/Login.tsx
export default function Login({ status, canResetPassword }: LoginProps) {
return (
<GuestLayout>
<div className="max-w-md py-8">
<AuthCard>
<Head title="Log in" />
<Logo />
<ValidationErrors className="mb-4" />
<form method="POST" action={route('login')}>
<TextInput
name="email"
type="email"
required
label="Email"
value={old('email', '')}
/>
{/* Add custom fields */}
<TextInput
name="premium"
type="checkbox"
label="Premium User"
/>
<PrimaryButton className="mt-4">
Log in
</PrimaryButton>
</form>
</AuthCard>
</div>
</GuestLayout>
);
}
Hook into Auth Events:
AuthServiceProvider:
public function boot() {
Auth::attempting(function ($user, $password) {
Log::debug("Login attempt for: {$user->email}");
});
}
Custom Password Reset:
ForgotPasswordController and override sendResetLinkEmail:
public function sendResetLinkEmail(Request $request) {
$this->validate($request, ['email' => ['required', 'email']]);
// Custom logic (e.g., send SMS instead of email)
SMS::to($request->email)->send('Reset password code: ' . Str::random(6));
return back()->with('status', __("Password reset link sent!"));
}
API Rate Limiting:
app/Providers/AuthServiceProvider.php:
Sanctum::throttlePersonalAccessTokensPerMinute(5);
Sanctum::throttlePersonalAccessTokensPerHour(100);
How can I help you explore Laravel packages today?