auth.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. <?php
  2. header("Access-Control-Allow-Origin: *");
  3. header("Content-Type: application/json; charset=UTF-8");
  4. header("Access-Control-Allow-Methods: POST, OPTIONS");
  5. header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
  6. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  7. exit(0);
  8. }
  9. require_once __DIR__ . '/../config/database.php';
  10. require_once __DIR__ . '/../models/User.php';
  11. $database = new Database();
  12. $db = $database->getConnection();
  13. $user = new User($db);
  14. // Start session for authenticated requests
  15. session_start();
  16. $request_method = $_SERVER['REQUEST_METHOD'];
  17. switch($request_method) {
  18. case 'GET':
  19. if(isset($_GET['action']) && $_GET['action'] === 'current-user') {
  20. // Get current authenticated user
  21. require_once __DIR__ . '/../middleware/auth.php';
  22. $auth = new AuthMiddleware($db);
  23. $current_user = $auth->authenticate();
  24. if ($current_user) {
  25. http_response_code(200);
  26. echo json_encode($current_user);
  27. } else {
  28. http_response_code(401);
  29. echo json_encode(array("message" => "Not authenticated"));
  30. }
  31. } elseif(isset($_GET['action']) && $_GET['action'] === 'status') {
  32. // Check if user is logged in
  33. if(isset($_SESSION['user_id']) && !empty($_SESSION['user_id'])) {
  34. // Validate session by checking if user still exists and is active
  35. $user->id = $_SESSION['user_id'];
  36. $user->readOne();
  37. if($user->username && $user->is_active) {
  38. http_response_code(200);
  39. echo json_encode(array(
  40. "message" => "User is authenticated",
  41. "user" => array(
  42. "id" => $user->id,
  43. "username" => $user->username,
  44. "email" => $user->email,
  45. "first_name" => $user->first_name,
  46. "last_name" => $user->last_name,
  47. "role" => $user->role
  48. )
  49. ));
  50. } else {
  51. // User no longer exists or is inactive, destroy session
  52. session_destroy();
  53. http_response_code(401);
  54. echo json_encode(array("message" => "Session invalid - user not found or inactive"));
  55. }
  56. } else {
  57. http_response_code(401);
  58. echo json_encode(array("message" => "No active session"));
  59. }
  60. } else {
  61. http_response_code(400);
  62. echo json_encode(array("message" => "Invalid action"));
  63. }
  64. break;
  65. case 'POST':
  66. $data = json_decode(file_get_contents("php://input"));
  67. if($data->action === 'login') {
  68. if(!empty($data->username) && !empty($data->password)) {
  69. $authenticated_user = $user->authenticate($data->username, $data->password);
  70. if($authenticated_user) {
  71. $_SESSION['user_id'] = $authenticated_user['id'];
  72. $_SESSION['username'] = $authenticated_user['username'];
  73. $_SESSION['role'] = $authenticated_user['role'];
  74. $_SESSION['first_name'] = $authenticated_user['first_name'];
  75. $_SESSION['last_name'] = $authenticated_user['last_name'];
  76. http_response_code(200);
  77. echo json_encode(array(
  78. "message" => "Login successful",
  79. "user" => array(
  80. "id" => $authenticated_user['id'],
  81. "username" => $authenticated_user['username'],
  82. "email" => $authenticated_user['email'],
  83. "first_name" => $authenticated_user['first_name'],
  84. "last_name" => $authenticated_user['last_name'],
  85. "role" => $authenticated_user['role']
  86. )
  87. ));
  88. } else {
  89. http_response_code(401);
  90. echo json_encode(array("message" => "Invalid credentials"));
  91. }
  92. } else {
  93. http_response_code(400);
  94. echo json_encode(array("message" => "Username and password are required"));
  95. }
  96. } elseif($data->action === 'register') {
  97. if(!empty($data->username) && !empty($data->email) && !empty($data->password) && !empty($data->first_name) && !empty($data->last_name)) {
  98. // Check if username or email already exists
  99. $existing_user = $user->findByEmail($data->email);
  100. if($existing_user) {
  101. http_response_code(409);
  102. echo json_encode(array("message" => "Email already exists"));
  103. break;
  104. }
  105. $existing_user = $user->read();
  106. while($row = $existing_user->fetch(PDO::FETCH_ASSOC)) {
  107. if($row['username'] === $data->username) {
  108. http_response_code(409);
  109. echo json_encode(array("message" => "Username already exists"));
  110. break 2;
  111. }
  112. }
  113. $user->username = $data->username;
  114. $user->email = $data->email;
  115. $user->password_hash = password_hash($data->password, PASSWORD_DEFAULT);
  116. $user->first_name = $data->first_name;
  117. $user->last_name = $data->last_name;
  118. $user->role = $data->role ?? 'user';
  119. if($user->create()) {
  120. http_response_code(201);
  121. echo json_encode(array("message" => "User registered successfully"));
  122. } else {
  123. http_response_code(503);
  124. echo json_encode(array("message" => "Unable to register user"));
  125. }
  126. } else {
  127. http_response_code(400);
  128. echo json_encode(array("message" => "Required fields are missing"));
  129. }
  130. } elseif($data->action === 'logout') {
  131. // Start session if not already started
  132. if (session_status() === PHP_SESSION_NONE) {
  133. session_start();
  134. }
  135. // Destroy session
  136. session_destroy();
  137. http_response_code(200);
  138. echo json_encode(array("message" => "Logged out successfully"));
  139. } else {
  140. http_response_code(400);
  141. echo json_encode(array("message" => "Invalid action"));
  142. }
  143. break;
  144. default:
  145. http_response_code(405);
  146. echo json_encode(array("message" => "Method not allowed."));
  147. break;
  148. }
  149. ?>