This commit is contained in:
2025-10-24 14:54:44 -05:00
parent cb06217ef7
commit 6a58e19b10
16 changed files with 1172 additions and 138 deletions

View File

@@ -2,26 +2,166 @@
namespace App\Controllers;
use App\Services\AuthService;
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class AuthController
{
private AuthService $authService;
public function __construct()
{
$this->authService = new AuthService();
}
public function login(Request $request, Response $response): Response
{
$response->getBody()->write(json_encode(['message' => 'Login endpoint']));
// For traditional login, you would validate credentials here
// For OIDC/social login, redirect to appropriate provider
$params = $request->getParsedBody();
$provider = $params['provider'] ?? null;
switch ($provider) {
case 'google':
$authUrl = $this->authService->getGoogleAuthorizationUrl();
$response->getBody()->write(json_encode(['redirect_url' => $authUrl]));
break;
case 'github':
$authUrl = $this->authService->getGithubAuthorizationUrl();
$response->getBody()->write(json_encode(['redirect_url' => $authUrl]));
break;
default:
// Traditional login
$email = $params['email'] ?? '';
$password = $params['password'] ?? '';
// Validate credentials (simplified)
if ($this->validateCredentials($email, $password)) {
$token = $this->generateToken($email);
$response->getBody()->write(json_encode(['token' => $token, 'message' => 'Login successful']));
} else {
$response = $response->withStatus(401);
$response->getBody()->write(json_encode(['error' => 'Invalid credentials']));
}
break;
}
return $response->withHeader('Content-Type', 'application/json');
}
public function logout(Request $request, Response $response): Response
{
$response->getBody()->write(json_encode(['message' => 'Logout endpoint']));
// Clear any tokens, sessions, etc.
$response->getBody()->write(json_encode(['message' => 'Logout successful']));
return $response->withHeader('Content-Type', 'application/json');
}
public function register(Request $request, Response $response): Response
{
$response->getBody()->write(json_encode(['message' => 'Register endpoint']));
$params = $request->getParsedBody();
$email = $params['email'] ?? '';
$name = $params['name'] ?? '';
$password = $params['password'] ?? '';
// Validate input
if (empty($email) || empty($name) || empty($password)) {
$response = $response->withStatus(400);
$response->getBody()->write(json_encode(['error' => 'All fields are required']));
return $response->withHeader('Content-Type', 'application/json');
}
// Register user (simplified)
if ($this->registerUser($email, $name, $password)) {
$token = $this->generateToken($email);
$response->getBody()->write(json_encode(['token' => $token, 'message' => 'Registration successful']));
} else {
$response = $response->withStatus(500);
$response->getBody()->write(json_encode(['error' => 'Registration failed']));
}
return $response->withHeader('Content-Type', 'application/json');
}
public function googleCallback(Request $request, Response $response): Response
{
try {
$userData = $this->authService->handleGoogleCallback($request);
// Check if user exists, create if not
$user = $this->findOrCreateUser($userData);
// Generate JWT token
$token = $this->generateToken($user['email']);
// Redirect to frontend with token
$redirectUrl = $_ENV['FRONTEND_URL'] ?? 'http://localhost:3000' . "/auth/callback?token={$token}";
return $response->withHeader('Location', $redirectUrl)->withStatus(302);
} catch (\Exception $e) {
$response = $response->withStatus(500);
$response->getBody()->write(json_encode(['error' => $e->getMessage()]));
return $response->withHeader('Content-Type', 'application/json');
}
}
public function githubCallback(Request $request, Response $response): Response
{
try {
$userData = $this->authService->handleGithubCallback($request);
// Check if user exists, create if not
$user = $this->findOrCreateUser($userData);
// Generate JWT token
$token = $this->generateToken($user['email']);
// Redirect to frontend with token
$redirectUrl = $_ENV['FRONTEND_URL'] ?? 'http://localhost:3000' . "/auth/callback?token={$token}";
return $response->withHeader('Location', $redirectUrl)->withStatus(302);
} catch (\Exception $e) {
$response = $response->withStatus(500);
$response->getBody()->write(json_encode(['error' => $e->getMessage()]));
return $response->withHeader('Content-Type', 'application/json');
}
}
private function validateCredentials(string $email, string $password): bool
{
// This would normally check against a database
// For now, just return true for demo purposes
return !empty($email) && !empty($password);
}
private function registerUser(string $email, string $name, string $password): bool
{
// This would normally store the user in a database
// For now, just return true for demo purposes
return true;
}
private function findOrCreateUser(array $userData): array
{
// This would normally query the database to find or create a user
// For now, return mock user data
return [
'id' => 1,
'email' => $userData['email'],
'name' => $userData['name'],
];
}
private function generateToken(string $email): string
{
$payload = [
'iss' => 'MerchantsOfHope', // Issuer
'sub' => $email, // Subject
'iat' => time(), // Issued at
'exp' => time() + 3600 // Expiration time (1 hour)
];
return JWT::encode($payload, $_ENV['JWT_SECRET'], 'HS256');
}
}