'authorization_code', 'code' => $code, 'redirect_uri' => $OIDC_REDIRECT_URI, 'client_id' => $OIDC_CLIENT_ID, 'code_verifier' => $codeVerifier, ]; if ($OIDC_CLIENT_SECRET !== '') { $post['client_secret'] = $OIDC_CLIENT_SECRET; } $ch = curl_init($tokenEndpoint); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($post, '', '&', PHP_QUERY_RFC3986), CURLOPT_TIMEOUT => 15, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, ]); $tokenResponse = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); $curlErr = curl_error($ch); curl_close($ch); if ($tokenResponse === false || $httpCode !== 200) { http_response_code(500); echo $debug ? 'Échec échange token : ' . htmlspecialchars($curlErr ?: (string)$tokenResponse) : 'Erreur d\'authentification.'; exit; } $tokens = json_decode((string)$tokenResponse, true) ?: []; $accessToken = $tokens['access_token'] ?? null; $idToken = $tokens['id_token'] ?? null; if (!$accessToken) { http_response_code(500); echo $debug ? 'Access token manquant.' : 'Erreur d\'authentification.'; exit; } // UserInfo $ch = curl_init($userInfoEndpoint); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => ['Authorization: Bearer ' . $accessToken], CURLOPT_TIMEOUT => 10, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, ]); $userInfoResponse = curl_exec($ch); $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($userInfoResponse === false || $httpCode !== 200) { http_response_code(500); echo $debug ? 'Échec UserInfo.' : 'Erreur d\'authentification.'; exit; } $claims = json_decode((string)$userInfoResponse, true) ?: []; $email = $claims['email'] ?? null; // Fallback : lire l'email depuis le payload du id_token if (!$email && $idToken && substr_count($idToken, '.') === 2) { [, $p, ] = explode('.', $idToken, 3); $payload = json_decode((string)base64_decode(strtr($p, '-_', '+/'), true), true); if (is_array($payload) && !empty($payload['email'])) { $email = $payload['email']; } } if (!$email) { http_response_code(400); echo $debug ? 'Email non fourni par l\'IdP.' : 'Impossible de récupérer votre email.'; exit; } // Ouvre la session authentifiée session_regenerate_id(true); $_SESSION['user_email'] = strtolower(trim($email)); $_SESSION['oidc'] = [ 'issuer' => $OIDC_ISSUER, 'sub' => $claims['sub'] ?? null, 'access_token' => $accessToken, 'id_token' => $idToken, 'expires_at' => time() + (int)($tokens['expires_in'] ?? 3600), ]; $target = $_SESSION['oidc_return_to'] ?? '/'; unset($_SESSION['oidc_return_to'], $_SESSION['oidc_flow']); if (!is_string($target) || $target === '' || $target[0] !== '/') { $target = '/'; } header('Location: ' . $target, true, 303); exit;