session_helper.php 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <?php
  2. /**
  3. * Session Helper for API Authentication
  4. * Provides session validation functions for API endpoints
  5. */
  6. // Start session if not already started
  7. if (session_status() == PHP_SESSION_NONE) {
  8. session_start();
  9. }
  10. /**
  11. * Validate user session and return user data
  12. * @param PDO $db Database connection
  13. * @return array|null User data if valid, null if invalid
  14. */
  15. function validateSession($db) {
  16. // Check if session exists
  17. if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id'])) {
  18. return null;
  19. }
  20. try {
  21. // Validate user still exists and is active
  22. $query = "SELECT id, username, email, first_name, last_name, role, is_active
  23. FROM users
  24. WHERE id = ? AND is_active = 1";
  25. $stmt = $db->prepare($query);
  26. $stmt->bindParam(1, $_SESSION['user_id']);
  27. $stmt->execute();
  28. $user = $stmt->fetch(PDO::FETCH_ASSOC);
  29. if ($user) {
  30. return $user;
  31. } else {
  32. // User no longer exists or is inactive, destroy session
  33. session_destroy();
  34. return null;
  35. }
  36. } catch (PDOException $e) {
  37. // Database error, invalidate session
  38. session_destroy();
  39. return null;
  40. }
  41. }
  42. /**
  43. * Require authentication for API endpoints
  44. * @param PDO $db Database connection
  45. * @return array User data
  46. */
  47. function requireAuth($db) {
  48. $user = validateSession($db);
  49. if (!$user) {
  50. http_response_code(401);
  51. echo json_encode(array(
  52. "message" => "Authentication required",
  53. "error" => "UNAUTHORIZED"
  54. ));
  55. exit;
  56. }
  57. return $user;
  58. }
  59. /**
  60. * Send JSON response with proper headers
  61. * @param mixed $data Response data
  62. * @param int $statusCode HTTP status code
  63. * @param string $message Response message
  64. */
  65. function sendJsonResponse($data, $statusCode = 200, $message = '') {
  66. http_response_code($statusCode);
  67. $response = array();
  68. if (!empty($message)) {
  69. $response['message'] = $message;
  70. }
  71. if ($data !== null) {
  72. if (is_array($data) && isset($data['message'])) {
  73. $response = array_merge($response, $data);
  74. } else {
  75. $response['data'] = $data;
  76. }
  77. }
  78. header('Content-Type: application/json');
  79. echo json_encode($response);
  80. exit;
  81. }
  82. /**
  83. * Handle CORS preflight requests
  84. */
  85. function handleCors() {
  86. header("Access-Control-Allow-Origin: *");
  87. header("Content-Type: application/json; charset=UTF-8");
  88. header("Access-Control-Allow-Methods: GET, POST, PUT, DELETE, OPTIONS");
  89. header("Access-Control-Allow-Headers: Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
  90. if ($_SERVER['REQUEST_METHOD'] == 'OPTIONS') {
  91. exit(0);
  92. }
  93. }
  94. ?>