nawasara/auth-primitives
Lightweight Laravel/PHP auth primitives package providing foundational building blocks for authentication and authorization. Use it to compose your own login flows, guards, and access rules with minimal opinionated structure.
Installation
composer require nawasara/auth-primitives
Publish the package's configuration (if available) and migrations:
php artisan vendor:publish --provider="Nawasara\AuthPrimitives\AuthPrimitivesServiceProvider"
php artisan migrate
Key Concepts
AuthPrimitiveManager, SessionHandler, TokenGenerator, CsrfGuard.config/auth-primitives.php for default settings (e.g., token expiration, session drivers).First Use Case: Secure Session Handling
use Nawasara\AuthPrimitives\Facades\AuthPrimitive;
// Start a session
AuthPrimitive::session()->start();
// Store user data
AuthPrimitive::session()->put('user_id', 123);
// Retrieve later
$userId = AuthPrimitive::session()->get('user_id');
Token-Based Authentication
// Generate a token (e.g., for API)
$token = AuthPrimitive::token()->generate();
// Validate a token
if (AuthPrimitive::token()->validate($token)) {
$user = AuthPrimitive::token()->getUser($token);
}
CSRF Protection in Controllers
use Nawasara\AuthPrimitives\Http\Middleware\VerifyCsrfToken;
// Add middleware to routes/forms
Route::post('/submit', [Controller::class, 'store'])
->middleware(VerifyCsrfToken::class);
// Generate CSRF token in Blade
<input type="hidden" name="_csrf" value="{{ AuthPrimitive::csrf()->token() }}">
Custom Session Drivers
Extend Nawasara\AuthPrimitives\Contracts\SessionHandler:
class RedisSessionHandler implements SessionHandler {
public function get($key) { ... }
public function set($key, $value) { ... }
// ...
}
Bind it in AuthServiceProvider:
AuthPrimitive::extend('redis', function () {
return new RedisSessionHandler();
});
Cookie Management
// Set a secure cookie
AuthPrimitive::cookie()->queue('pref_language', 'en', 60 * 24);
// Retrieve in middleware
$language = AuthPrimitive::cookie()->get('pref_language');
Auth::user() can populate session data).AuthPrimitive::token() for stateless auth; pair with Laravel Sanctum/Passport for additional features.AuthPrimitive in tests:
$this->partialMock(AuthPrimitive::class, function ($mock) {
$mock->shouldReceive('session')->andReturnSelf();
$mock->shouldReceive('get')->with('user_id')->andReturn(1);
});
Session Hijacking
same-site and secure cookie flags in production:
AuthPrimitive::cookie()->setSecure(true);
AuthPrimitive::cookie()->setSameSite('strict');
Token Expiration
'tokens' => [
'ttl' => 60 * 60 * 24, // 24 hours
],
CSRF Double-Submit Cookie
SameSite=Lax cookies, ensure your frontend sends the CSRF token on every request (e.g., via fetch headers or meta tags).Race Conditions
DB::transaction(function () {
if (AuthPrimitive::token()->validate($token)) {
// Critical update
}
});
\Log::debug('Session contents:', AuthPrimitive::session()->all());
secret_key (configured in auth-primitives.php).domain and path in config match your app’s URL.Custom Token Payloads
Extend Nawasara\AuthPrimitives\Token:
class CustomToken extends Token {
public function getCustomData() {
return $this->payload['custom_data'] ?? null;
}
}
Bind it in the service provider.
Event Listeners
Listen for auth events (e.g., TokenGenerated):
AuthPrimitive::token()->on('generated', function ($token) {
\Log::info("New token created: {$token->id}");
});
Fallback Drivers
Configure fallback session drivers in config/auth-primitives.php:
'sessions' => [
'driver' => 'redis',
'fallback' => 'file',
],
Rate Limiting Tokens
Combine with Laravel’s throttle middleware:
Route::middleware(['throttle:60,1', 'auth:token'])->post('/api/data');
How can I help you explore Laravel packages today?