'authorization_code', 'code' => $code, 'redirect_uri' => Config::get('OAUTH_REDIRECT_URI'), 'client_id' => Config::get('OAUTH_CLIENT_ID'), 'client_secret' => Config::get('OAUTH_CLIENT_SECRET'), ]); } public static function fetchProfile(string $accessToken): array { return self::httpGetBearer(Config::get('OAUTH_PROFILE_URL'), $accessToken); } private static function httpPost(string $url, array $form): array { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => http_build_query($form), CURLOPT_HTTPHEADER => ['Accept: application/json'], CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, ]); $body = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err || $body === false) { error_log('oauth POST failed: ' . $err); return []; } return json_decode((string)$body, true) ?? []; } private static function httpGetBearer(string $url, string $token): array { $ch = curl_init($url); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => [ 'Authorization: Bearer ' . $token, 'Accept: application/json', ], CURLOPT_TIMEOUT => 10, CURLOPT_CONNECTTIMEOUT => 5, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, ]); $body = curl_exec($ch); $err = curl_error($ch); curl_close($ch); if ($err || $body === false) { error_log('oauth GET failed: ' . $err); return []; } return json_decode((string)$body, true) ?? []; } }