Пишу на Drupal авторизацию на Zoho Books

Вывод отладочных сообщений

Для начала я столкнулся с проблемой, что не могу выводить отладочные сообщения — т.е. выполнять трассировку, как я привык, работая с разработкой на скриптовых языках.

Погугли и попробовал использовать drupal_set_message — не работает, выдает ошибку «Call to undefined function Drupal\zohobooks\Controller\drupal_set_message».

Тогда решил выводить сообщения в итоговую страницу (markup):

Но тут внезапно обнаружил, что print_r выводит сразу на экран:

Чем и воспользовался, упростив вывод:

Первые запрос по OAuth

Далее я начал заниматься запросами к API Zoho Books.

Сначала я ошибочно использовал пример с post, потом переделал его на get, обильно расставив отладочные сообщения:

		$params = [
			'scope' => 'ZohoBooks.fullaccess.all',
			'redirect_uri' => $redirect_uri,
			'client_id' => $client_id,
			'client_secret' => $client_secret,
			'access_type' => 'online'
			];
		$response = http("https://accounts.zoho.com/oauth/v2/auth", $params);
 
 
function http($url, $params) {
  $ch = curl_init($url . http_build_query($params));
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  //curl_setopt($ch, CURLINFO_HEADER_OUT, true);
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_HEADER, false);
 
  $res = curl_exec($ch);
  $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
  $header = curl_getinfo($ch, CURLINFO_HEADER_OUT);
  print_r('CURL: url: ' . $url . ' header: ' . $header. ' res: ' . $res . "<BR>" );
 
  return json_decode($res);
}

В итоге получил саму строку запроса и то, что она выдает:

Проверил, ввел адрес в адресную строку, получил такую же ошибку. Ну что же, нужно теперь написать правильный get-запрос.

Оказывается в коде выше я забыл знак вопроса «?» между адресом и параметрами.

После этого я получил какой-то ответ от ZB, хотя и не совсем понятный о чем это:

Проблема решилась добавлением типа ответа:

Но теперь я получил странную ошибку «Переданный идентификатор клиента не существует»:

Пришлось обратиться за подсказкой к более опытному товарищу в команде.

Оказалось, нужно было выбирать другой тип приложения — server-based:

С ним все заработало.

Дальнейшие шаги OAuth

При попытке получить refresh токен из grant токена получил непонятную ошибку «An error occurred while processing your request. Please try again later.»:

Минут 30 тупил, и только потом, когда начал гуглить подобные вопросы, дошло, что запрос должен быть POST, а не GET.

Но в ответ я получаю сообщение, что code ошибочный:

Array ( [code] => 1000.* [client_id] => 1000.* [client_secret] => * [redirect_uri] => https://myfirm.com/404 [grant_type] => authorization_code ) Refresh token result:
stdClass Object ( [error] => invalid_code )

Мой код получения refresh token выглядит так:

		//Access Token
		if (empty($access_token)) {
			$params = [
				'code' => $grant_token,
				'client_id' => $client_id,
				'client_secret' => $client_secret,
				'redirect_uri' => $redirect_uri,
				'grant_type' => 'authorization_code',
				];
			$response = http_post("https://accounts.zoho.com/oauth/v2/token", $params);
 
			//drupal_set_message('TST');
 
			//$html = $html . 'PARAMS: ' . print_r($params) . '<BR>';
			print_r('Refresh token query: <BR>');
			print_r($params);
			print_r('Refresh token result: <BR>');
			print_r($response);
		//$html = $html . 'RESULT: ' .  print_r($response) . '<BR>';
		}
 
 
 
function http_post($url, $params) {
  $ch = curl_init($url);
  curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($ch, CURLOPT_POST, 1);
  curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params, '', '&'));
  curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($ch, CURLOPT_HEADER, false);
 
  $res = curl_exec($ch);
  $url = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL);
  $header = curl_getinfo($ch, CURLINFO_HEADER_OUT);
  print_r('CURL: url: ' . $url . ' header: ' . $header. ' res: ' . $res . "<BR>" );
 
  return json_decode($res);
}
 
 
 

Зайдя тут в тупик, решил набрать эту последовательность запросов в POSTMAN (онлайн-версии), полностью повторить то, что делает этот программист в видео:

На самом деле я не особо вслушивался в его слова и просто промотал к моменту получения refresh-токена. И решил сделать то же самое.

И все равно у меня не получилось, даже когда я выполнять POST через онлайн-форму пост-запроса.

Я психанул и написал статью об OAuth2 на свой сайт, хабр и на инфостарт.

Пришлось обратиться к админу, он мне выдал refresh токен для тестового аккаунта Zoho, чтобы я мог писать код дальше. Почему не работала авторизация, мне так и не стало понятно, возможно, code живет очень мало? В любом случае, вопросы авторизации решили отложить до продакшна.

А я принялся писать продуктивный код по загрузке инвойсов в Друпал.

fixin

Программирую на 1С с 1999 года. В 1С просто Гений. В 2020 году ушел из офиса на вольные хлеба фриланса. Принимаю заказы.

Читайте также:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *