Authentication Module

Overview

The ForgeAuth module provides a complete authentication system for your Forge applications. It includes features for user registration, login, session management, and route protection through middleware.

Setup

To use the authentication module in your Forge application, include it in your modules list:

// In forge.json
{
    "modules": [
        "ForgeAuth"
    ]
}

Routes

Configure authentication routes in your application's routes file:

// Authentication Routes
$router->get('/login', [AuthController::class, 'loginForm']);
$router->post('/login', [AuthController::class, 'login']);
$router->get('/register', [AuthController::class, 'registerForm']);
$router->post('/register', [AuthController::class, 'register']);

// Protected Routes Group
$router->group('/dashboard', function (RouterInterface $router) {
    $router->middleware([\Forge\Modules\ForgeAuth\Middleware\AuthMiddleware::class]);
    $router->get('/', [DashboardController::class, 'index']);
});

Middleware

The AuthMiddleware protects routes from unauthorized access:

class AuthMiddleware extends MiddlewareInterface
{
    public function handle(Request $request, Closure $next): Response
    {
        if (!$request->session()->has('user_id')) {
            return Redirect::to('/login');
        }

        return $next($request);
    }
}

Controller

Example implementation of an authentication controller:

class AuthController
{
    /**
     * @inject
     */
    private AuthService $auth;
    private Session $session;
    private ViewEngineInterface $view;

    public function login(Request $request): Response
    {
        try {
            $credentials = $request->validate([
                'email' => 'required|email',
                'password' => 'required|min:6'
            ]);

            $user = $this->auth->login($credentials);
            return Redirect::to('/dashboard');
        } catch (\Exception $e) {
            $this->session->setFlash('error', $e->getMessage());
            return Redirect::to('/login');
        }
    }

    public function register(Request $request): Response
    {
        try {
            $credentials = $request->validate([
                'email' => 'required|email|unique:users',
                'password' => 'required|min:8|confirmed',
                'password_confirmation' => 'required|min:8',
            ]);

            $user = $this->auth->register($credentials);
            return Redirect::to('/dashboard');
        } catch (\Exception $e) {
            $this->session->setFlash('error', $e->getMessage());
            return Redirect::to('/register');
        }
    }
}

Usage

The authentication service provides methods for user authentication and registration:

// Login a user
$user = $auth->login([
    'email' => 'user@example.com',
    'password' => 'password'
]);

// Register a new user
$user = $auth->register([
    'email' => 'newuser@example.com',
    'password' => 'password',
    'password_confirmation' => 'password'
]);

// Check if user is authenticated
if ($request->session()->has('user_id')) {
    // User is logged in
}

Note: The ForgeAuth module handles session management automatically. After successful authentication, the user's ID is stored in the session.