The Security class provides essential security features including CSRF protection and Bearer token authentication.
Namespace
Aeros\Src\Classes\Security
Methods
csrf
Creates a hidden input field with a CSRF token. This token helps validate if a request is authorized.
Returns: HTML string containing a hidden input field
Usage Example
// In your view/template
<form method="POST" action="/users">
<?= security()->csrf() ?>
<input type="text" name="name" required>
<input type="email" name="email" required>
<button type="submit">Create User</button>
</form>
Generated HTML
<input type="hidden" id="csrf_token" name="csrf_token" value="a1b2c3d4-e5f6-7890..." />
validateCsrfToken
Validates a CSRF token from the request against the session token.
public function validateCsrfToken(?string $token): bool
The CSRF token from the request to validate.
Returns: true if token is valid, false otherwise
Usage Example
// In your controller or middleware
class UserController
{
public function create()
{
$token = request()->csrf_token;
if (!security()->validateCsrfToken($token)) {
return response()->json([
'error' => 'Invalid CSRF token'
], 403);
}
// Process the request...
}
}
Middleware Example
class CsrfMiddleware
{
public function handle()
{
// Skip CSRF check for GET, HEAD, OPTIONS
if (in_array(request()->method, ['GET', 'HEAD', 'OPTIONS'])) {
return true;
}
$token = security()->getCsrfTokenFromRequest();
if (!security()->validateCsrfToken($token)) {
return response()->json(['error' => 'CSRF token mismatch'], 419);
}
return true;
}
}
getBearerToken
Extracts the Bearer token from the Authorization header.
public function getBearerToken(): ?string
Returns: Bearer token string or null if not found
Usage Example
// In your API authentication middleware
class ApiAuthMiddleware
{
public function handle()
{
$token = security()->getBearerToken();
if (!$token) {
return response()->json([
'error' => 'Authorization token required'
], 401);
}
// Validate token
$user = $this->validateToken($token);
if (!$user) {
return response()->json([
'error' => 'Invalid token'
], 401);
}
// Attach user to request
request()->user = $user;
return true;
}
}
Client Request Example
curl -X GET https://api.example.com/users \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
regenerateCsrfToken
Regenerates the CSRF token. Should be called after successful form submission to prevent token reuse.
public function regenerateCsrfToken(): string
Returns: The new CSRF token
Usage Example
class UserController
{
public function create()
{
// Validate CSRF token
if (!security()->validateCsrfToken(request()->csrf_token)) {
return response()->json(['error' => 'Invalid token'], 403);
}
// Process the request
$userId = db()->table('users')->insert([
'name' => request()->name,
'email' => request()->email,
]);
// Regenerate token after successful submission
security()->regenerateCsrfToken();
return response()->json([
'success' => true,
'user_id' => $userId,
]);
}
}
getCsrfTokenFromRequest
Retrieves the CSRF token from either the request body or headers.
public function getCsrfTokenFromRequest(): ?string
Returns: CSRF token string or null if not found
Supported Sources
- Request Body - Checks
request()->csrf_token
- Header - Checks
X-CSRF-TOKEN header
Usage Example
// In middleware
class CsrfMiddleware
{
public function handle()
{
// Automatically checks both body and headers
$token = security()->getCsrfTokenFromRequest();
if (!security()->validateCsrfToken($token)) {
return response()->json([
'error' => 'CSRF token missing or invalid'
], 419);
}
return true;
}
}
AJAX Request Example
// JavaScript - sending CSRF token in header
fetch('/api/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-TOKEN': document.querySelector('#csrf_token').value
},
body: JSON.stringify({
name: 'John Doe',
email: '[email protected]'
})
});
CSRF Protection Flow
1. Token Generation
CSRF tokens are automatically generated when a session is created:
// In session initialization
session()->csrf_token = \Ramsey\Uuid\Uuid::uuid4()->toString();
<form method="POST" action="/submit">
<?= security()->csrf() ?>
<!-- form fields -->
</form>
3. Validate Token
// In your controller or middleware
$token = security()->getCsrfTokenFromRequest();
if (!security()->validateCsrfToken($token)) {
return response()->json(['error' => 'CSRF validation failed'], 419);
}
4. Regenerate After Use
// After successful form submission
security()->regenerateCsrfToken();
Bearer Token Authentication Flow
1. Client Obtains Token
class AuthController
{
public function login()
{
// Validate credentials
$user = db()->table('users')
->where('email', request()->email)
->first();
if (!$user || !password_verify(request()->password, $user->password)) {
return response()->json(['error' => 'Invalid credentials'], 401);
}
// Generate token (using JWT or similar)
$token = $this->generateToken($user);
return response()->json([
'token' => $token,
'user' => $user,
]);
}
}
2. Client Includes Token in Requests
curl -X GET https://api.example.com/profile \
-H "Authorization: Bearer YOUR_TOKEN_HERE"
3. Server Validates Token
class ApiMiddleware
{
public function handle()
{
$token = security()->getBearerToken();
if (!$token) {
return response()->json(['error' => 'Unauthorized'], 401);
}
// Validate and decode token
$user = $this->verifyToken($token);
if (!$user) {
return response()->json(['error' => 'Invalid token'], 401);
}
request()->user = $user;
return true;
}
}
Best Practices
CSRF Protection
- Always include CSRF tokens in forms that modify data (POST, PUT, DELETE)
- Regenerate tokens after successful form submissions
- Use the
X-CSRF-TOKEN header for AJAX requests
- Implement CSRF middleware for automatic validation
- Exclude read-only operations (GET, HEAD, OPTIONS) from CSRF checks
Bearer Token Authentication
- Use HTTPS to prevent token interception
- Implement token expiration
- Store tokens securely on the client side
- Validate tokens on every protected endpoint
- Include proper error messages for debugging
- Consider using JWT (JSON Web Tokens) for stateless authentication
Helper Function
The framework provides a global security() helper function:
// Generate CSRF field
echo security()->csrf();
// Validate CSRF token
if (security()->validateCsrfToken(request()->csrf_token)) {
// Process request
}
// Get Bearer token
$token = security()->getBearerToken();
- Session management for CSRF token storage
- Request object for accessing tokens from client
- Response helpers for returning authentication errors
- Middleware for automatic security validation